[問題] 產生0~1之間 不包含0有小數點的亂數

作者: abab7974 (幻滅)   2014-06-19 16:55:50
我是使用
((double)rand()/RAND_MAX )
來產生0~1之間有含小數點的均勻分布數
可是最近弄一個東西需要log(1/u)
u是 0~1之間有含小數點的均勻分布數
可是這樣會導致當u=0的時候 log(1/g)會出現-1.#inf
所以我想知道C++大於0的最小數是多少
讓當u=0時可以加上那個最小數
因為我GOOGLE C++ 跟最小值 會出現一堆 XXX數取最小甚麼的...
謝謝
作者: donkeychen (Bad_To_The_Bone)   2014-06-19 17:05:00
do { } until { log(1/u) != -1 } 再取一次呢?看你的目的是不要0 而已..
作者: abab7974 (幻滅)   2014-06-19 17:21:00
嗯..我當初想說是0的話 就直接給他最小數比較簡單
作者: blackwindy (黑色的風)   2014-06-19 17:25:00
那樣做的話機率會不均等(最小數的機率變高) 不如重骰
作者: Keiichi (Keiichi)   2014-06-19 17:31:00
(rand()+1.0)/(RAND_MAX+1.0)
作者: blackwindy (黑色的風)   2014-06-19 17:54:00
std::uniform_real_distribution<double> unif(l, u);
作者: abab7974 (幻滅)   2014-06-19 17:56:00
可是我的想法是當它骰到0就是最小數 如果骰掉0又重骰就表示最小數的機率變低了
作者: blackwindy (黑色的風)   2014-06-19 18:02:00
不取0的意思而已
作者: HudsonE   2014-06-19 18:28:00
最小數本來就會骰到, 所以最小數的機率會變兩倍
作者: iamnotgm (伽藍之黑)   2014-06-19 19:19:00
重骰就好了 你直接取最小數反而放大了最小數的機率
作者: LPH66 (-6.2598534e+18f)   2014-06-19 19:53:00
如果原 PO 還是沒轉過來的話, 想想骰個骰子但我不想要骰 1如果骰到 1 就當 2 那 2 的機率就是別人的兩倍正確的做法是骰到 1 重骰, 這樣才是平均的在這裡只是變成一個 RAND_MAX 面骰而已...
作者: abab7974 (幻滅)   2014-06-19 20:36:00
嗯..似乎是這樣 那我之前的想法搞錯了 謝指教

Links booklink

Contact Us: admin [ a t ] ucptt.com