Re: [請益] 亂數表有沒有規律??
: → littleshan:我是說,你提到「打字間隔集中在0.3~0.7秒」的問題 05/20 12:30
: → littleshan:只要用高精確度的 timer 就可以解決 05/20 12:31
: → littleshan:除非你的手能控制打字間隔落在 X.XX3 秒至 X.XX7 秒間 05/20 12:32
首先說,我看不懂前一篇的質數;我就是需要一個數學家來幫我
(這樣我就不必多回一篇了)
再來我提一下我不懂的細節,而且我不認為夠密就當然夠均勻
舉例來說,如果我有一個夠均勻的亂數,十種變化
int r=random(); // 0~9
我要把它縮小到 9種變化
int R= (r/9.0)*8; // 0~8
這樣,因為不是擴展,絕對不可能有變化太少的問題
但可能偏重於某幾個變化
假設亂數函式並不亂,只是均勻,只是我做證明的工具
我當然可以給它一個偽函式,就簡單遞增,到最大值時繞捲為 0 好了
於是,r= 0,1,2,3,4,5,6,7,8,9 依序十次
而 R= 0,0,1,2,3,4,5,6,7,8 以無條件捨去來做浮點轉換
反正就算你要四捨五入也會有一樣的問題
好,以上 0 出現兩次
亂數的均勻度要大量才能趨近,否則我只有9種值卻要求做10次,當然不可能公平
那我們做90次好了 (9和10的公倍數;我隱隱聞到質數的道理,但又無法了解)
這90次裏,我希望 r 均勻出現 0~9 九次
然後 R=f(r) 這個公式要改一下,就可以讓 0~8 均勻出現十次
(九十次做完次數才對就好了;但簡單的答案中,循環出現也是可以接受的
因為我不討論有多亂,只先討論均勻)
從這裏可以看出,如果我只有簡單的公式做 R=f(r)
那麼做十次,R=0 會重覆出現兩次
做90次呢?它重覆出現 20次
而畫成圖會怎樣?就是在 R=0 的位置比較粗,變一條直線
不均勻就是這樣呀~
因為只有用簡單的公式去把原始亂數擴展或縮小到我要的範圍
原本的 0x00~0xFF 擴展成 0x0000~0xFFFF,我還算有直覺去解
然後我可以把 65536 的變化程度向內縮,去滿足任何一種(小於65536)範圍的亂數需求
但是這條不均勻惹出的直線,始終會非常明顯
光要亂數是有啦
但好像尾牙抽獎,0號那位同仁每次都比別人多一個中獎機會
你說,這亂數公平嗎?
或者我不要用乘法,用捨去法可以嗎?
R=r,但當 r=9 時,重抽一次
這樣我可不可以聲明 R 的均勻度公平了?
只是有 1/10 的機率會使計算減慢(重抽一次)
當然,大部份時候,這樣設計程式都叫想太多
我們很簡單的把原始亂數除到變成 0~1 的浮點數再乘開就好了
沒有人會知道其實他天生中獎率就比別人低了
只怪他命不好 :P
不好意思,也有黑心程式 XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.219.65.16
推
05/20 21:20, , 1F
05/20 21:20, 1F
如果可以,好像最省事 XD,但如果我要縮至 0~3..總之小心累死,不斷重抽..
※ 編輯: HuangJC 來自: 61.219.65.16 (05/20 22:14)
討論串 (同標題文章)
ask-why 近期熱門文章
PTT職涯區 即時熱門文章