Re: [問題] 平均的亂數產生數字個數 C++[新問題]

看板C_and_CPP作者 (-858993460)時間13年前 (2012/05/03 09:52), 編輯推噓2(201)
留言3則, 1人參與, 最新討論串6/7 (看更多)
※ 引述《EdisonX (閉上眼的魚)》之銘言: : (1) 大亂數問題 :   * b. ieee754 : ieee754 欄位分 signed/exp/mantissa 欄位, 直接針對 : 這此欄位給整數亂數, 轉回 floating, : 拿到 NAN / non-normalize 再重新產生一次, 這方法沒驗證過。 這個做法應該是有問題的 (只是對小範圍比較不容易發現) 主要問題在於浮點數的本質 以 exp 的值來分的話 exp 為 0 時其數值範圍是 [1,2) exp 為 1 時其數值範圍是 [2,4) 等等 因此這個方法會使得 P(X \in [1,2)) = P(X \in [2,4)) = P(X \in [4,8)) = ... = P(X \in [1/2,1)) = P(X \in [1/4,1/2)) = ... 這樣子產生出來的亂數會集中在小數字 (容易知道產生小於 1 的數字的機率和大於 1 的數字機率相等, 但所產生數字的範圍卻是 [2^-126,2^127] (float 的話)) 不過如果不去動 exp 欄位的話卻不失為一個產生 [0,1) 的好方法 也就是固定 exp = 0 次方 (float 為 127, double 為 1023), sign = 0 (正數) 只對 mantissa 部份的每個 bit 取亂數 這樣可以得到 [1,2) 的均勻亂數 因為這相當於在 [1,2) 當中取 2^(mantissa bits) 個均分點 再在其中 (含 1, 不含 2) 均勻隨機地挑一個 因此這樣可以得到 [1,2) 之間的均勻隨機浮點數 再減去 1 就能得到 [0,1) 了 -- 'You've sort of made up for it tonight,' said Harry. 'Getting the sword. Finishing the Horcrux. Saving my life.' 'That makes me sound a lot cooler then I was,' Ron mumbled. 'Stuff like that always sounds cooler then it really was,' said Harry. 'I've been trying to tell you that for years.' -- Harry Potter and the Deathly Hollows, P.308 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.91

05/03 18:13, , 1F
分析得漂亮!! 謝謝指教。
05/03 18:13, 1F

05/03 18:19, , 2F
剛想了一下,產生[0,1)後,再擴到[LOW,UP],對於大範圍而言,
05/03 18:19, 2F

05/03 18:19, , 3F
比較 RAND_MAX=32767 效果應會再佳些。
05/03 18:19, 3F
文章代碼(AID): #1FebL7RA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FebL7RA (C_and_CPP)