Re: [問題] 消失的亂數

看板C_and_CPP (C/C++)作者 (sjgau)時間16年前 (2009/09/24 14:43), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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

09/24 14:49, , 1F
謝謝大大 我剛也發現到這樣除也只有32767種變化
09/24 14:49, 1F

09/24 14:50, , 2F
本來就有很多浮點數會消失了,只是剛好在0.5讓我注意到
09/24 14:50, 2F

09/24 14:50, , 3F
#16hVIzB8 討論串可以看看(那篇標題下得不好)
09/24 14:50, 3F
文章代碼(AID): #1AknKTcx (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1AknKTcx (C_and_CPP)