Giúp mình lập hàm ngẫu nhiên

Liên hệ QC

diennv50

Thành viên mới
Tham gia
27/8/09
Bài viết
22
Được thích
0
điều kiện các giá trị trong ô không được lặp lại các bác ah
 

File đính kèm

  • Book1.xlsx
    10.4 KB · Đọc: 18
điều kiện các giá trị trong ô không được lặp lại các bác ah
Tham khảo bài này nhé:
 
Bạn tham khảo hàm mảng tự tạo sau đây trong khi chờ các siêu công thức ra tay:
PHP:
Function gpeSN()
  Dim J As Long, W As Integer, VTr As Integer
  Dim StrC As String:                           ReDim Arr(1 To 10, 1 To 5) As String
 
For W = 1 To 50    'Nôi Chuôi      '
    If W > 9 Then
        StrC = StrC & CStr(W)
    Else
        StrC = StrC & "0" & CStr(W)
    End If
Next W
For J = 1 To 99       ' Bam       '
    VTr = 9 + 13 * Rnd() \ 1
    If VTr Mod 2 = 0 Then VTr = VTr + 1
    StrC = Mid(StrC, VTr, 2) & Left(StrC, VTr - 1) & Mid(StrC, VTr + 2, Len(StrC))
Next J
For J = 1 To 10        ' Gán       '
    For W = 1 To 5
        Arr(J, W) = Left(StrC, 2):          StrC = Mid(StrC, 3, Len(StrC))
    Next W
Next J
gpeSN = Arr()
End Function

Cách xài:
B1: Dùng chuột tô chọn vùng liên tục gồm mươi hàng & 5 cột
B2: Bấm chuột lên thanh công thức & nhập cú pháp =gpeSN()
B3: Kết thúc bỡi tổ hợp phím dành cho hàm mảng

Chúc vui & thành công!
 
Tham khảo bài này nhé:
Cái link trên có tất cả trên 100 bài.
Trong đó có những bài không xài được. Nếu tôi không lầm thì chính chủ thớt ấy lúc đầu viết theo giải thuật khác; và về sau học kinh nghiệm lại viết theo giải thuật khác hoàn toàn.
 
Bạn tham khảo hàm mảng tự tạo sau đây trong khi chờ các siêu công thức ra tay:
PHP:
Function gpeSN()
  Dim J As Long, W As Integer, VTr As Integer
  Dim StrC As String:                           ReDim Arr(1 To 10, 1 To 5) As String

For W = 1 To 50    'Nôi Chuôi      '
    If W > 9 Then
        StrC = StrC & CStr(W)
    Else
        StrC = StrC & "0" & CStr(W)
    End If
Next W
For J = 1 To 99       ' Bam       '
    VTr = 9 + 13 * Rnd() \ 1
    If VTr Mod 2 = 0 Then VTr = VTr + 1
    StrC = Mid(StrC, VTr, 2) & Left(StrC, VTr - 1) & Mid(StrC, VTr + 2, Len(StrC))
Next J
For J = 1 To 10        ' Gán       '
    For W = 1 To 5
        Arr(J, W) = Left(StrC, 2):          StrC = Mid(StrC, 3, Len(StrC))
    Next W
Next J
gpeSN = Arr()
End Function

Cách xài:
B1: Dùng chuột tô chọn vùng liên tục gồm mươi hàng & 5 cột
B2: Bấm chuột lên thanh công thức & nhập cú pháp =gpeSN()
B3: Kết thúc bỡi tổ hợp phím dành cho hàm mảng

Chúc vui & thành công!
Tui đố Bác Sa, Ba Tê, Leo Nguyễn viết bài này với.....1 vòng lặp
Viết được, tuần sau ghé bác Sa tui mời người....3 lon Ken...lùn
Tui cũng thèm nhậu quá rồi
Híc
 
1 vòng lặp thì thua. Bạn post code lên đi
Code mình có thể dài hơn bạn 10 lần, nhưng chắc chắn phải chạy nhanh hơn code bạn 1000 lần
 
1 vòng lặp thì thua. Bạn post code lên đi
Code mình có thể dài hơn bạn 10 lần, nhưng chắc chắn phải chạy nhanh hơn code bạn 1000 lần
1) Hihi, tui đang đố các bạn nhậu ( có nêu từng nick rõ ràng) của tui chứ đâu dám đố bạn
2) Với 50 số thì...chớp mắt cái đã chạy xong, lấy gì mà so sánh, còn vài ngàn số thì tui...hông so sánh vì .... chưa viết bao giờ
Thân
 
Hi hi, mình cũng đang nhậu, nay 16
 
Loại đề bài này thì hơn thua nhau ở độ phức tạp của giải thuật chứ vòng lặp nghĩa lý gì?
 
Tui đố Bác Sa, Ba Tê, Leo Nguyễn viết bài này với.....1 vòng lặp
Viết được, tuần sau ghé bác Sa tui mời người....3 lon Ken...lùn
Tui cũng thèm nhậu quá rồi
Híc
Cái này có thể coi là 1 vòng lặp được không bác.
Mã:
Sub vonglap()
    Dim arr(1 To 50) As Boolean, a As Long, darr(1 To 5, 1 To 10), b As Long, c As Long, d As Long
    a = 1
    Do
       c = Rnd() * 50
     If c Then
       If arr(c) = False Then
           b = b + 1
           d = d + 1
           If b = 11 Then a = a + 1: b = 1
              darr(a, b) = c
              arr(c) = True
       End If
    End If
    Loop Until d = 50
    Range("A1:j5").Value = darr
End Sub
 
Cái này có thể coi là 1 vòng lặp được không bác.
Mã:
Sub vonglap()
    Dim arr(1 To 50) As Boolean, a As Long, darr(1 To 5, 1 To 10), b As Long, c As Long, d As Long
    a = 1
    Do
       c = Rnd() * 50
     If c Then
       If arr(c) = False Then
           b = b + 1
           d = d + 1
           If b = 11 Then a = a + 1: b = 1
              darr(a, b) = c
              arr(c) = True
       End If
    End If
    Loop Until d = 50
    Range("A1:j5").Value = darr
End Sub
Ok, đúng là 1 vòng
Hú hồn, nếu 3 người kia mà làm thì mình thua rồi
Nhưng vòng này chạy....hơi nhiều (>50)
Thân
 
Mã:
Sub BaLonKen()
    Dim arr(1 To 50) As Long, darr(1 To 5, 1 To 10)
    Dim a As Long, b As Long, c As Long, i As Long
    Dim k As Long
    a = 1
    Randomize
    
    For i = 1 To 50
        k = 50 + 1 - i
       c = Int(Rnd() * k) + 1
       If arr(c) = 0 Then arr(c) = c
       If arr(k) = 0 Then arr(k) = k
       b = b + 1
        If b = 11 Then a = a + 1: b = 1
        darr(a, b) = arr(c)
        arr(c) = arr(k)

    Next i
    Range("A1:j5").Value = darr
End Sub
 
For i = 1 To 50
k = 50 + 1 - i
For k = 50 to 1 Step -1

Đồng thời, bạn phỏng theo code bài #11 mà không để ý rằng người viết code này không có kinh nghiệm về chuyển đổi chỉ số giữa mảng 1 chiều và 2 chiều.

b = b + 1
d = d + 1
If b = 11 Then a = a + 1: b = 1
darr(a, b) = c
arr(c) = True
darr( Int(d/10) + 1, d Mod 10 + 1) = c ' code tínhn dòng và cột của phần tử d+1 (d khởi đầu là 0)
arr(c) = True
d = d + 1
 
Web KT
Back
Top Bottom