Re: [問題] 平均的亂數產生數字個數 C++[新問題]
※ 引述《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
05/03 18:19, 2F
→
05/03 18:19, , 3F
05/03 18:19, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 7 篇):