看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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