作者sjgau (sjgau)
看板C_and_CPP
標題Re: [問題] 消失的亂數
時間Fri Sep 25 10:28:44 2009
如果你 希望產生的亂數的變化越多越好,
而且保持均勻分布的亂數要求,
那麼,可以考慮
a= 7^5,
b= 0,
c= (2^31) - 1
那麼,產生的亂數範圍是
1 - 2147483648
在產生 同一個亂數之前,
每一個 數字都會 出現一次
如果覺得這個亂數的週期不夠長,
那麼可以考慮 double 的精確度是
52個 bits, 大約是 2^52
把 a, b, c擴大,測試找出一組 合適使用的
亂數產生的 常數,配合 ftime() 函數的 ms + time()
函數的 second, 把 (second % (10*86400))*1000 + ms 當作
亂數的 種子數。
這樣子,應該夠亂,也夠長了。
good luck to you!
※ 引述《liwmewmew (如果大海能夠)》之銘言:
: 小弟最近在研究亂數
: 想取[0, 1]之間的任一浮點數亂數 (包括0與1)
: 所以寫出了 rand()/(float)RAND_MAX 這樣的語法
: 結果發現,因為分母是奇數(32767),所以絕對取不到0.5這個亂數
: 所以試著把分母變為偶數 rand()/(float)(RAND_MAX+1)
: 但發現這樣取不到1.0這個亂數
: 又如果改成 (rand()+1)/(float)(RAND_MAX+1)
: 那可以想像會取不到0.0這個亂數
: 如果我把分母乘兩倍(一個偶數) rand()/(float)RAND_MAX*2
: 最後只要我敢把偶數乘數也乘到rand()上 ,那我的亂數就會分佈不均的樣子
: (rand()/(float)RAND_MAX*2)*2
: 不知道有沒有大大有什麼建議的
: 真的非常謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.30.75.208
推 stupidgod08:seed用這麼亂有差別嗎 09/25 12:06
推 LPH66:對某些需求可能會有... 09/25 12:16
→ sjgau:a= 16807, b= 0, c= 2147483647, c is a prime number 09/25 12:30
→ sjgau:有筆誤,產生的亂數範圍是:1 - 2147483646 09/25 12:31
→ sjgau:使用 double 的話,週期長度可以到 4.5e15, 增加了 一百萬倍 09/25 12:33
推 stupidgod08:唔..光是time(NULL)的週期就夠長了, 除了一秒內要做多 09/25 13:38
→ stupidgod08:次srand以外, 我想不到其它理由要用這麼亂的seed 09/25 13:39
→ MOONRAKER:"除了一秒內要做多次rand以外"?真是幽默! 09/25 14:08
→ MOONRAKER:processor這麼快,你不想在一秒內連續取多次亂數都難! 09/25 14:09
推 stupidgod08:我說srand.... 09/25 14:13
推 MysterySW:這樣不會有overflow的問題嗎 09/25 15:44
→ sjgau:改用 double, 使用 fmod() 取需要的 亂數範圍,ex. 1 - 42 09/25 16:04