• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tạo Số Ngẫu Nhiên Không Lập Lại

Các mẹo vặt linh tinh khác, không thuộc nhóm nào
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Năm 03/04/2008 9:46 am

Thủ thuật: Tạo Số Ngẫu Nhiên Không Lập Lại
Tác giả: truongphu
Mô tả: Tạo Số Ngẫu Nhiên Không Lập Lại, code ngắn gọn


Đề tài Tạo Số Ngẫu Nhiên Không Lập Lại đã được bàn luận ở forum cũ , Bài viết nầy góp phần làm đơn giản hóa vấn đề (viết lại bài của NoBi).
Cần một list1, các biến có thể khai là byte nếu ít
  1.  
  2. Private Sub Form_Load()
  3. Dim a(20) As Integer, i As Integer, j As Integer
  4. Randomize
  5.     For i = 1 To 20
  6.         a(i) = Int(Rnd * 20) + 1
  7.            For j = 1 To i - 1
  8.                 If i = 1 Then Exit For
  9.                 While a(i) = a(j)
  10.                     a(i) = Int(Rnd * 20) + 1
  11.                     j = 1
  12.                 Wend
  13.            Next
  14.     List1.AddItem a(i)
  15.     Next
  16. End Sub
  17.  


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi anhtuyenbk » T.Năm 03/04/2008 11:35 am

Mình xin giới thiệu cho các bạn một cách khác . Kết quả trả về là Array 1 chiều kiểu Integer.
Code dài hơn nhưng số lần lặp ít hơn nhiều :D
Hàm cần thiết

Mã: Chọn hết

  1. Public Function CreateRandomNumberNoDuplicate(ByVal SoNumber As Integer) As Integer()
  2. Dim i As Integer
  3. Dim Ketqua() As Integer: ReDim Ketqua(SoNumber - 1)
  4. 'Tao gia tri ban dau
  5. For i = 0 To SoNumber - 1
  6.     Ketqua(i) = i + 1
  7. Next
  8. Dim ChisoRandom As Integer, Temp As Integer
  9. For i = 0 To SoNumber - 1
  10.     Randomize
  11.     ChisoRandom = Fix(Rnd(1) * (SoNumber - 1))
  12.     Temp = Ketqua(i)
  13.     Ketqua(i) = Ketqua(ChisoRandom)
  14.     Ketqua(ChisoRandom) = Temp
  15. Next
  16. 'Tra ve ket qua
  17.     CreateRandomNumberNoDuplicate = Ketqua
  18. End Function

Cách sử dụng

Mã: Chọn hết

  1. Private Sub Command2_Click()
  2. Dim c() As Integer
  3. c = CreateRandomNumberNoDuplicate(10)
  4. Text1.Text = Text1.Text & vbCrLf
  5. For i = 0 To UBound(c())
  6.     Text1.Text = Text1.Text & c(i) & " ; "
  7. Next
  8. End Sub


Kết quả

Mã: Chọn hết

  1.  
  2. 4 ; 5 ; 7 ; 9 ; 2 ; 3 ; 1 ; 10 ; 8 ; 6 ;
  3. 3 ; 5 ; 7 ; 2 ; 1 ; 4 ; 10 ; 6 ; 9 ; 8 ;
  4. 5 ; 4 ; 7 ; 6 ; 1 ; 3 ; 9 ; 10 ; 8 ; 2 ;
  5. 2 ; 3 ; 7 ; 9 ; 8 ; 5 ; 4 ; 1 ; 10 ; 6 ;
  6. 2 ; 4 ; 8 ; 5 ; 7 ; 10 ; 6 ; 1 ; 3 ; 9 ;
  7. 4 ; 7 ; 10 ; 2 ; 6 ; 1 ; 5 ; 3 ; 8 ; 9 ;
  8. 9 ; 10 ; 8 ; 5 ; 3 ; 1 ; 2 ; 7 ; 4 ; 6 ;
  9. 4 ; 10 ; 2 ; 9 ; 3 ; 5 ; 8 ; 1 ; 7 ; 6 ;
  10. 3 ; 7 ; 10 ; 8 ; 1 ; 4 ; 2 ; 9 ; 5 ; 6 ;
Sửa lần cuối bởi anhtuyenbk vào ngày T.Năm 03/04/2008 12:06 pm với 3 lần sửa.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

vinhphuoc91
Thành viên tích cực
Thành viên tích cực
Bài viết: 146
Ngày tham gia: T.Tư 26/03/2008 5:52 pm
Đến từ: Phú Yên
Been thanked: 15 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi vinhphuoc91 » T.Năm 03/04/2008 11:47 am

Tốt lắm, chơi thuật đảo vị trí, nếu không chơi nó số 10 luôn luôn ở cuối :))
My website : http://tinthoitrang.net

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi anhtuyenbk » T.Năm 03/04/2008 12:12 pm

Sửa lại rồi đó.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi giongto35 » T.Năm 03/04/2008 12:15 pm

hehe , anhtuyenbk làm giống ý tưởng của em , đó là xáo vị trí , chứ nếu làm như cách truongphu, hay nobi(nghĩa là vừa tạo xong sẽ kiểm tra) sẽ xét rất lâu .

Mã: Chọn hết

  1.  
  2. Dim A(100) As Integer
  3. Dim n As Integer
  4. Private Sub XaoSo(ByRef so1 As Integer, ByRef so2 As Integer)
  5. Dim tg As Integer
  6.     tg = so1
  7.     so1 = so2
  8.     so2 = tg
  9. End Sub
  10. Private Sub Form_Load()
  11. n = InputBox("nhap so phan tu")
  12.  
  13. Randomize
  14.     For i = 1 To n
  15.         A(i) = i
  16.     Next
  17.     For i = 1 To n
  18.         XaoSo A(i), A(Round(Rnd * n))
  19.     Next
  20.     Text1.Text = " "
  21.     For i = 1 To n
  22.         Text1.Text = Text1.Text & A(i) & " "
  23.     Next
  24. End Sub
  25.  
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Năm 03/04/2008 12:51 pm

cảm ơn anhtuyenbk, Rất hay vì gọn và dễ hiểu, ít vòng lặp. Tuy nhiên đôi chổ nên chỉnh sửa để thao tác nhẹ nhàng và kết quả không lỗi.
ghi chú: vì nghề nghiệp của bản thân, tôi chỉ biết chỉnh sửa còn sáng tạo cỏn yếu! :D

Mã: Chọn hết

  1.  
  2. Option Explicit
  3. Private Sub Form_Load()
  4. Dim Temp As New Collection, i As Integer, NN As Integer
  5.     For i = 1 To (10) + 1 'Tao gia tri ban dau
  6.         Temp.Add (i)
  7.     Next
  8. For i = 0 To (10) - 1  'Tao so ngau nhien
  9.     Randomize
  10.     NN = Fix(Rnd(1) * (Temp.Count - 1)) + 1
  11.     List1.AddItem Temp(NN)
  12.     Temp.Remove (NN)
  13. Next
  14. End Sub
  15.  

ghi chú: số (10) = 10 trong ngoặc là trị số của mảng muốn khai
Code gọn được nhiều, trong sáng, vòng lặp tối thiểu
Đã TEST

Tb: hê hê, mời giongto35 xem bài học của tôi từ anhtuyenbk ;) ;)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi giongto35 » T.Năm 03/04/2008 1:06 pm

Cái ý tưởng đảo vị trí của em nói trong forum cũ rùi đó :-( , chẳng ai nói
http://quantoancity.com/caulacbovb/foru ... b1b#p72089

Ý bác truong phu là gì đây :-?
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi anhtuyenbk » T.Năm 03/04/2008 1:41 pm

Cái code mà truongphu là cái code mình mới post hồi sáng nhưng đã xóa đi vì cái số cuối luôn luôn là số 10. Tưởng chưa ai đọc chứ . he he
Nhưng truongphu đã khắc phục bằng cách + thêm 1 giá trị vào collection do đó, số cuối cùng sẽ được tham gia vào phép ngẫu nhiên.
Hàm được sửa lại

Mã: Chọn hết

  1. Public Function CreateRandomNumberNoDuplicate(ByVal SoNumber As Integer) As Integer()
  2. Dim Temp As New Collection, i As Integer, Ketqua() As Integer
  3. ReDim Ketqua(SoNumber - 1)
  4. For i = 1 To SoNumber + 1   'Tao gia tri ban dau
  5.     Temp.Add (i)
  6. Next
  7. Dim ChisoRandom As Integer  'Tao so ngau nhien
  8. For i = 0 To SoNumber - 1
  9.     Randomize
  10.     ChisoRandom = Fix(Rnd(1) * (Temp.Count - 1)) + 1
  11.     Ketqua(i) = Temp(ChisoRandom)
  12.     Temp.Remove (ChisoRandom)
  13. Next
  14. 'Tra ve ket qua
  15.     CreateRandomNumberNoDuplicate = Ketqua
  16. End Function
  17.  
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Hai 02/03/2009 9:22 am

gửi bởi MATH-INFO » 1/3/09 10:11 am

Mã: Chọn hết

  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.     Dim a(20) As Integer, i As Integer, nCount As Integer
  5.     Dim res As Boolean
  6.  
  7.     Randomize
  8.     nCount = 10
  9.     res = Gen_random(a, nCount, 1, 10)
  10.     For i = 1 To nCount
  11.         List1.AddItem (a(i))
  12.     Next
  13. End Sub
  14.  
  15. Function Gen_random(a() As Integer, nCount As Integer, iMin As Integer, iMax As Integer) As Boolean
  16.    
  17.     Dim nDistance  As Integer
  18.     nDistance = iMax - iMin + 1
  19.     If (nDistance < nCount) Then Gen_random = False
  20.  
  21.     Dim b() As Integer
  22.     ReDim b(nDistance)
  23.    
  24.     Dim i As Integer, rand As Integer
  25.     For i = iMin To iMax
  26.         b(i - iMin) = i
  27.     Next
  28.  
  29.     For i = 1 To nCount
  30.         rand = Int(rnd * nDistance)
  31.  
  32.         a(i) = b(rand)
  33.         b(rand) = b(nDistance - 1)
  34.  
  35.         nDistance = nDistance - 1
  36.     Next
  37.  
  38.     Gen_random = True
  39.  
  40. End Function
  41.  


gửi bởi truongphu » 1/3/09 10:59 am

Mã: Chọn hết

  1. Private Sub Command1_Click()
  2. Dim a%, u%, d
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Randomize
  5.     Do While List1.ListCount < 10
  6.         a = Int(Rnd * 10) + 1
  7.         If Not d.Exists(a) Then
  8.             d.Add a, u
  9.             List1.AddItem a
  10.             u = u + 1
  11.         End If
  12.     Loop
  13. End Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Sáu 13/03/2009 10:10 am

Sau đây là code Ngẫu nhiên không lập lại 20 số tự nhiên đầu tiên dùng ListBox:
Cần List1 và Command1

Mã: Chọn hết

  1. Private Sub Command1_Click()
  2. List1.Clear
  3.     For i = 0 To 19
  4.         List1.AddItem i
  5.     Next
  6. Randomize
  7.     For i = 0 To 19
  8.         j = Int(Rnd * (List1.ListCount - i))
  9.             If j = -1 Then j = 0
  10.         a = List1.List(j)
  11.         List1.RemoveItem j
  12.         List1.AddItem a
  13.     Next
  14. End Sub
  15.  
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
ledoninh
VIP
VIP
Bài viết: 38
Ngày tham gia: T.Sáu 26/08/2005 3:52 pm
Đến từ: HCMC
Has thanked: 1 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi ledoninh » T.Tư 06/05/2009 11:19 am

Xem qua những topic mà bác truongphu tham gia, thấy nhiều và đa dạng dễ sợ, phải gọi bác là chiến binh vì sự quả cảm !
Tôi xin bàn thêm về chủ đề lấy các giá trị ngẫu nhiên không trùng lắp.
Ngay trong forum cũ đã có khá nhiều người tham gia các chủ đề tương tự, nay lại có thêm chủ đề này. Lẽ ra bác truongphu nên làm bài tổng kết thì tốt hơn là nêu lại vấn đề.
Tóm lại, ta có hai cách:
1. Đánh số các phần tử, lấy ngẫu nhiên, bỏ giá trị lấy được ra khỏi tâp hợp rồi tiếp tục lấy ngẫu nhiên. Topic đầu tiên trên diễn đàn VB này là 'Lấy ngẫu nhiên bài trong 52 lá' : http://quantoancity.com/caulacbovb/foru ... 911c1b0b1c . Ưu điểm: lần nào lấy cũng 'chắc cú', không sợ trùng lắp. Nhược điểm: với tập hợp hàng trăm ngàn hoặc vô hạn phần tử thì không áp dụng được.
2. Cứ lấy ngẫu nhiên, lần sau phải so sánh với các lần trước, nếu trùng thì làm lại. Topic đầu tiên trên diễn đàn VB này đề cập là 'Trúc xanh' (trong "Đề tài chung", sao giờ tìm không thấy, nhưng chắc là có trong vbLib). Ưu điểm: không làm tốn bộ nhớ và áp dụng được cho mọi tập hợp (không rỗng). Nhược điểm: dễ bị kéo dài do kết quả sau trùng kết quả trước, nhất là khi ta lấy gần hết các giá trị của tập hợp.
Trong hướng thứ hai, Nobi và những người khác cho các giá trị đã lấy vào mảng rồi dùng vòng lặp kiểm tra, theo tôi, nếu ta cần lấy tập con khá lớn thì mảng này cũng là vấn đề. Trong trường hợp đó, có lẽ đưa vào file thì mới ổn. Tôi xin giới thiệu một cách dùng tạm, không biết là nhanh hơn hay chậm hơn cách của các bạn khác, đó là dùng string:

Mã: Chọn hết

  1. str="_"
  2. m=10000
  3. y=2009.0506
  4. Randomize
  5. i=1
  6. while i<m
  7.     x=rnd*y
  8.     ss=Cstr(x) & "_"     'sửa
  9.     If Instr(str, "_" & ss)=0 then   'sửa
  10.         i=i+1
  11.         str=str & ss
  12.     end if
  13. wend

Ta có thể lấy các phần tử từ str bằng hàm split...
---
Hôm nay đọc 1 bài viết vận dụng code này của bác truongphu, chợt giật mình vì lý luận có chỗ hở, đành sửa lại. Thế mới biết, tính phê bình thì rất cao, còn tự phê có phần hạn chế !!!
Sửa lần cuối bởi ledoninh vào ngày T.Hai 25/05/2009 10:31 am với 1 lần sửa.
Không mua hàng tiêu dùng của Trung Quốc, Đài Loan

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Tư 06/05/2009 2:14 pm

ledoninh đã viết:phải gọi bác là chiến binh vì sự quả cảm !


Cảm ơn lời động viên của anh ledoninh, chiến binh quả cảm vì... 'điếc không sợ súng!'

ledoninh đã viết:

Mã: Chọn hết

  1. If Instr(str,ss)=0 then


Tác giả góp thêm một cách với hàm Instr
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
ledoninh
VIP
VIP
Bài viết: 38
Ngày tham gia: T.Sáu 26/08/2005 3:52 pm
Đến từ: HCMC
Has thanked: 1 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi ledoninh » T.Tư 06/05/2009 4:19 pm

truongphu đã viết:Tác giả góp thêm một cách với hàm Instr

Lâu rồi tôi không lập trình với VB, nên ngẫu nhiên vậy thôi, tôi không nhớ cách dùng chính của hàm đó thế nào. Đoạn code trên tôi lấy từ trang asp của tôi (lấy ngẫu nhiên các câu hỏi trắc nghiệm rồi lưu vào cookie của user), chỉ thay số nguyên ở đó thành số double ở đây. Có điều, trong mã VBScript của asp thì không cần khai báo biến, còn VB thì cần, và hàm Randomize của VB không có "()" ở cuối.
Không mua hàng tiêu dùng của Trung Quốc, Đài Loan

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi truongphu » T.Năm 10/12/2009 2:56 pm

Module

  1. Dim NNKLL As String
  2. Public Function NgauNhien(ByValAs Integer) As Integer
  3. 1:  Randomize
  4.     Dim temp As String, sotam As Integer
  5.     sotam = Int(Rnd * Sô)
  6.     temp = "@" & CStr(sotam) & "#"
  7.     If InStr(1, NNKLL, temp) Then
  8.         GoTo 1
  9.     Else
  10.         NNKLL = NNKLL & temp
  11.         NgauNhien = sotam
  12.     End If
  13. End Function
  14. ' truongphu
  15. ' Sô là mâu~ không lâp lai
  16. ' Nê'u dùng Vòng lap, thì sô' Vòng lap không Ðuoc lo'n ho'n mâu~
  17. ' Vòng lap <= Sô
Tập tin đính kèm
Function Ngaunhien KLL.rar
(1.67 KiB) Đã tải 686 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi Kasper » T.Sáu 11/12/2009 2:50 pm

Góp vui một cách, cái này hồi trước hay dùng để đảo vị trí bài thi trắc nghiệm.
Kết quả sẽ trả về trong một Collection :D . Cực kỳ ngắn gọn, 5 dòng code thôi.
  1.     Dim c As New Collection
  2.     Dim i As Integer
  3.     On Error Resume Next
  4.     While c.Count < 20 '20 số phần tử cần random, random từ 1-20, không lấy số 0.
  5.        i = Int(1 + 20 * Rnd)
  6.         c.Add i, Str(i)
  7.     Wend
  8.  
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

PhuongThanh37
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 87
Ngày tham gia: T.Sáu 09/09/2005 1:38 pm
Đến từ: Liên Hà, Đông Anh, HN
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi PhuongThanh37 » T.Sáu 11/12/2009 10:14 pm

VB có sẵn function Rnd rồi mà.
  1. 'Ramdom từ 1 đến n
  2. 'Int((n * Rnd) + 1)
Uống Chanh & nghe Chanh hát

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi Kasper » T.Hai 14/12/2009 10:32 am

PhuongThanh37 đã viết:VB có sẵn function Rnd rồi mà.
  1. 'Ramdom từ 1 đến n
  2. 'Int((n * Rnd) + 1)


Cái này chỉ là random 1 số, số này nằm trong đoạn [1,n] chứ không phải random n số. :D
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

boy1234
Guru
Guru
Bài viết: 448
Ngày tham gia: T.Hai 13/10/2008 3:12 pm
Đến từ: Dĩ An - Bình Dương
Been thanked: 32 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi boy1234 » T.Sáu 24/12/2010 11:38 am

Xin các bác pro bớt chút thời gian cho e hỏi chút. E muốn làm 1 chương trình quay số trúng thưởng.
Ví dụ: có 100 phiếu phát ra. Chọn 20 phiếu trúng thưởng. Tôi muốn là mỗi lần bấm, nó sẽ sinh ra 1 số ngẫu nhiên từ 1 -> 100. Cái vướng mắc của tôi ở đây là mỗi lần quay sau thì số đã ra rồi không được sinh ra nữa. THuật toán chỗ này làm sao. Các bậc sư huynh ai biết xin chỉ giáo đàn em. Cảm ơn rất nhiều.

viewtopic.php?f=50&t=15894
Hic bài này hỏi vi phạm nội quy bị vô thùng rác mà mình cứ làm thử xong chẳng biết post vào đâu. :(
Cho vào đây nhé! Sr spam
Tập tin đính kèm
RandTop20.rar
(6.62 KiB) Đã tải 525 lần
Dạo này nghiện honda SS50

sir
Bài viết: 1
Ngày tham gia: T.Năm 23/12/2010 10:21 pm

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi sir » CN 02/01/2011 9:18 pm

"Ví dụ: có 100 phiếu phát ra. Chọn 20 phiếu trúng thưởng. Tôi muốn là mỗi lần bấm, nó sẽ sinh ra 1 số ngẫu nhiên từ 1 -> 100."
Đây là bài hôm trước tôi hỏi trên diễn đàn. Sau khi tham khảo của bác truongphu tôi đã viết chương trình quay số:
Tập tin đính kèm
Quayso.rar
(149.2 KiB) Đã tải 859 lần

Hình đại diện của người dùng
TheDark
Guru
Guru
Bài viết: 188
Ngày tham gia: T.Năm 04/11/2010 3:56 pm
Đến từ: Mang Thít - Vĩnh Long
Has thanked: 6 time
Been thanked: 33 time

Re: Tạo Số Ngẫu Nhiên Không Lập Lại

Gửi bàigửi bởi TheDark » T.Năm 13/01/2011 10:15 am

Mình đã xem qua các cách làm của các bạn! Nói chung là có 2 cách. Nhưng cách 1 mình thấy có 1 vấn đề rất lớn.
Cách 1 có thể tạo ra dãy ngẫu nhiên nhưng giá trị của các phần tử phải liên tục. Vấn đề là ở bước "Tao gia tri ban dau" . Các giá trị được tạo ra phải liên tục. Nếu dùng hàm Rnd ở đây thì lại bị trùng = !!!
Giã sử bài toán là tạo ra 20 số có giá trị ngẫu nhiên từ 1 ~ 100 thì làm thế nào?
Chẵng lẽ ta tạo ra 100 số, trộn lên rồi lấy ra 20 số!
Theo mình thì cách 2 có vẽ chậm nhưng lại rất ỗn định và tổng quát.


Quay về “[VB] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách