作者sjgau (sjgau)
看板C_and_CPP
標題Re: [問題] 消失的亂數
時間Thu Sep 24 14:43:40 2009
※ 引述《liwmewmew (如果大海能夠)》之銘言:
: 小弟最近在研究亂數
好好研究吧!亂數的用處 非常大。
: 想取[0, 1]之間的任一浮點數亂數 (包括0與1)
不合理!我看到的書,都說 >= 0.0, < 1.0
: 所以寫出了 rand()/(float)RAND_MAX 這樣的語法
: 結果發現,因為分母是奇數(32767),所以絕對取不到0.5這個亂數
這個 不稀奇,對於浮點數來說,電腦所能夠表示的 浮點數
是 離散的,是 不連續的。
很多數都 無法精確表示。
少一個 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
: 不知道有沒有大大有什麼建議的
: 真的非常謝謝
你可以 試著自己寫
R(n)= (R(n-1)*a + b)%c
a, b, c 的變化和 排列組合很多,
例如
a= 7^5, b= 0, c= (2^31) - 1
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.245.110.241
推 liwmewmew:謝謝大大 我剛也發現到這樣除也只有32767種變化 09/24 14:49
→ liwmewmew:本來就有很多浮點數會消失了,只是剛好在0.5讓我注意到 09/24 14:50
推 ckclark:#16hVIzB8 討論串可以看看(那篇標題下得不好) 09/24 14:50