PDA

View Full Version : [Q] Xin hỏi một chút về random



simon
10-06-2003, 11:30
Xin hỏi các huynh làm thế nào để dùng random mà không bị lặp lại

nganha
10-06-2003, 11:41
Dùng Randomize trước khi sử dụng hàm Rnd() thì có thể tránh được lặp lại.
Cú pháp
'.... code
Randomize
'.... code
x=Rnd()
'... code

Lighting_dragon
11-06-2003, 23:05
Bị lập lại là sao ?
Lập lại những số đã có rồi hay là thế nào.

dtt_vn
12-06-2003, 13:03
vang, vi do la random ma

gamehacker
12-06-2003, 13:19
Viết 1 hàm random riêng đi


Public Function Random(Min as Integer,Max as Integer) As Integer
'Khởi tạo Random
Randomize
Random = Min + (Max - Min) * Rnd
End Function


Bảo đảm hàm này rất tuyệt !

Nicky
12-06-2003, 19:24
To Lighting_dragon.
Khi dùng hàm Rnd ở VB (cũng như ở các ngôn ngữ khác) thì xảy ra hiện tượng lặp lại. Tức là lần chạy chương trình trước hàm Rdn cho bạn 3 số ví dụ là x,y,z thì lần chạy sau nó cũng sẽ ra x,y,z
Tuy nhiên đó chỉ là do chúng ta quên thôi, nếu sử dụng hàm Randomize trước thì sẽ không bao giờ lặp lại (trên lý thuyết thì có nhưng thực tế chắc không đâu :D).

White_Rose
13-06-2003, 02:04
Khi dùng hàm Rnd ở VB (cũng như ở các ngôn ngữ khácKhông phải ngôn nào cũng vậy đâu :-) đây là code trong vb.net (không dùng nen không rõ cú pháp có chuẩn không :D)


Dim r As Random = New Random()
intNumber = r.Next()
dblNumber = r.Next
dblNumber = r.Sample() '0 -> 1

simon
13-06-2003, 13:01
em đã dùng
randomize
x=int((5*rnd)+1) 'Lap trong khoang 1 den 5
thì x=3 lặp lại hai ba lần

trungnt88
16-06-2003, 18:57
dim a,b,c,h,kq as single

randomize
h=rnd*10
randomize
a=rnd*h
randomize
b=rnd*a*h
randomize
c=rnd*a*b*h
randomize
kq=rnd*a*b*c


'kq la` 1 so khong bao gio trung lap

Cận
16-06-2003, 19:20
Bài viết được gửi bởi simon
Xin hỏi các huynh làm thế nào để dùng random mà không bị lặp lại

to simon: muốn random không lặp lại thì làm như sau:
Ta dùng 2 mảng, mảng thứ nhất chứa kết quả tìm được, mảng thứ 2 là mảng đánh dấu các phần tử đã được chọn:
dim aTest(1 to 10) as boolean
dim aNum(1 to 10) as integer
call randomize
for i=1 to 10
aTest(i)=false
next
for i=1 to 10
do
aNum(i)=int(rnd*10+1)
loop until aTest(aNum(i))=false
aTest(aNum(i))=true
next

p/s: cái này đánh tay chứ chưa test, không biết đúng hay sai. lol

Mach2
16-06-2003, 20:28
Ah, random thì lặp lại là chuyện ko có gì lạ, vấn đề là lặp lại thành chu kỳ thui. Gọi randomize là khởi tạo lại seed bằng cách lấy giờ hệ thống, vậy thì sẽ "ngẫu nhiên" thui mà. Còn mí bạn dùng hàm random kết hợp với nhân chia gì đó thì cũng bằng thừa, có gì khác đâu... hờ hờ

simon
17-06-2003, 10:15
cách của boy_behind_glasses có thể áp dụng cho dãy nhiều số được không?
simon đã dùng 2 listbox và một hàm kiểm tra, kết quả cũng khả quan.

KEM_WALL
17-06-2003, 20:23
Bài viết được gửi bởi trungnt88
dim a,b,c,h,kq as single

randomize
h=rnd*10
randomize
a=rnd*h
randomize
b=rnd*a*h
randomize
c=rnd*a*b*h
randomize
kq=rnd*a*b*c


'kq la` 1 so khong bao gio trung lap

hêy, có cần phải randomize nhiều thế kô, walls nghĩ 1 lần ở đầu là đủ rùi mà

Mach2
17-06-2003, 22:51
đúng, randomize chỉ một lần là đủ, kêu nhiều cũng thế à...

xyz
20-06-2003, 01:11
ban quan tam toi random vui long gui mail cho toi u se nhan dc dap an cuc ky tuyet voi, toi ko the gui luc nay vi dang ban the nhe. my email rulearmy@yahoo.com

nvnptc
20-06-2003, 08:31
Bạn thử như thế này có được không, đảm bảo không tốn nhiều biến bộ nhớ như thế. x=Rnd*Rnd*Rnd*Rnd*......*Rnd*Rnd. Hi hi hi

quatbatieu
20-06-2003, 10:59
mình nhớ có mộ cách tạo số Random bàng cách lấy phần dư của phép chia mà kết quả là một số vô tỉ vô hạn không tuần hoàn, bạn có thể tạo ra phép chia này một cách đơn giãn bằng cách tạo ra một chuỗi các cắp số , sau đó lấy các kết quả thu được cho vào một chuỗi rồi lấy ra theo phần 10, 100, 1000...cách này có ổn không ? hì tại vì vừa viết vừa nghĩ thui, để vè thử coi đã :))

trungnt88
20-06-2003, 19:37
random nhiều cho đỡ lặp lại Nếu lặp lại thì xúi lắm !