Re: [問題] 消失的亂數

看板C_and_CPP作者 (sjgau)時間14年前 (2009/09/25 10:28), 編輯推噓5(507)
留言12則, 5人參與, 最新討論串3/3 (看更多)
如果你 希望產生的亂數的變化越多越好, 而且保持均勻分布的亂數要求, 那麼,可以考慮 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

09/25 12:06, , 1F
seed用這麼亂有差別嗎
09/25 12:06, 1F

09/25 12:16, , 2F
對某些需求可能會有...
09/25 12:16, 2F

09/25 12:30, , 3F
a= 16807, b= 0, c= 2147483647, c is a prime number
09/25 12:30, 3F

09/25 12:31, , 4F
有筆誤,產生的亂數範圍是:1 - 2147483646
09/25 12:31, 4F

09/25 12:33, , 5F
使用 double 的話,週期長度可以到 4.5e15, 增加了 一百萬倍
09/25 12:33, 5F

09/25 13:38, , 6F
唔..光是time(NULL)的週期就夠長了, 除了一秒內要做多
09/25 13:38, 6F

09/25 13:39, , 7F
次srand以外, 我想不到其它理由要用這麼亂的seed
09/25 13:39, 7F

09/25 14:08, , 8F
"除了一秒內要做多次rand以外"?真是幽默!
09/25 14:08, 8F

09/25 14:09, , 9F
processor這麼快,你不想在一秒內連續取多次亂數都難!
09/25 14:09, 9F

09/25 14:13, , 10F
我說srand....
09/25 14:13, 10F

09/25 15:44, , 11F
這樣不會有overflow的問題嗎
09/25 15:44, 11F

09/25 16:04, , 12F
改用 double, 使用 fmod() 取需要的 亂數範圍,ex. 1 - 42
09/25 16:04, 12F
文章代碼(AID): #1Al2hToj (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Al2hToj (C_and_CPP)