推 EdisonX: 我不建議你再研究這問題,答案是它的周期約是 21 億個數, 08/20 00:07
→ EdisonX: 解決它的方法是換一個亂數產生器,若願意從dev-c++跳出來 08/20 00:08
→ EdisonX: 的話,有其他周期較長,基本上不會讓你重覆的。 08/20 00:08
→ hexjacal: 那請問 Visual C++ 會有比較可行的方案嗎? 感謝您。 08/20 07:43
推 Leadgen: 只要你用的亂數源的Bit數有限,總有一天會再重覆的。 08/20 08:19
→ azureblaze: 比較新的編譯器能用Mersenne twister 08/20 08:37
推 johnjohnlin: C++11 有比較好用的 random 08/20 13:47
※ 編輯: hexjacal (1.165.185.171), 08/20/2014 14:27:05
推 yvb: 亂數 "分給五個袋子使用" 會 "不均勻"? 是你的實測還是推測? 08/20 19:27
→ yvb: 不管是一組或分多組, 每球被抽出的計次看來差異不大... 08/20 19:35
→ yvb: ^同組內的 08/20 19:42
推 EdisonX: google C++11 mt19937,它的週期絕對讓你夠用. 08/20 21:00
→ EdisonX: 原理如 az~ 大所言,用的是梅森旋轉法. 08/20 21:01
→ hexjacal: 分組不會影響均勻度,如果袋子的球數差異性很大呢? 08/20 21:10
→ azureblaze: 品質好的亂數產生器不會因為分組產生差別 08/20 21:14
→ azureblaze: 會有問題我覺得是程式寫法或統計的問題 08/20 21:14
→ hexjacal: 我在同張亂數表連取五數下對 21~25 取餘數作取球 08/20 21:17
→ hexjacal: 總感覺袋子間取的號碼不獨立,想分開來取試試看 08/20 21:18
→ azureblaze: "感覺"是什麼? 有數據嗎? 低樣本數看起來有模式很正常 08/20 21:20
→ wope: 如果是要數學上的均勻分布U(0,1) 有標準的演算方法 08/21 22:49
→ wope: 然後設v抽出來的值,取f(v)=(b-a)v+a 08/21 22:53
→ wope: f(v)=U(a,b),這樣就有a到b的均勻分布 08/21 22:55
→ wope: 最後 如果要1,2,3,4,5均勻抽樣 就設a=0.5,b=5.5,f(v)四捨五 08/21 22:58
→ wope: 入就是標準解 08/21 22:59
推 wope: 如果你要抽的不是uniform,要抽的pdf,g1(v), 08/21 23:02
→ wope: 就先對g1(v)積分得到G1(v),其反函數為G1-1(v) 08/21 23:06
→ wope: 所以抽出值為v=G1-1(U(0,1)),就會是你要的pdf 08/21 23:09
→ wope: 最後在高維度抽樣,f(v1,v2,...,vn),做法一樣 08/21 23:17
→ wope: 先求出邊際pdf f1(v1),f2(v2),...,fn(vn),積分得F1,F2,...,F 08/21 23:20
→ wope: ...,Fn 按照Fn的值取P個分割,所以全域有P^n 08/21 23:23
→ wope: 最後先抽U(0.5,P^n+0.5)決定在哪個分割,在分割內再 08/21 23:25
→ wope: 各變數自己抽,vi=U(Low Bounded ,Up Bounded) 08/21 23:29
→ wope: 這裡的Low或Up都是指vi這個分割內的上下界 08/21 23:31
→ wope: 另外,有另一種方法是在v方向做分割在值的方向 08/21 23:35
→ wope: 放機率(想成求期望值),這樣就可以得到抽樣結果(以pdf表示) 08/21 23:39
→ wope: 以上是之前處理10k個隨機變數的心得 08/21 23:45
→ hexjacal: 我的問題應該是模擬過程中,給定亂數表帶來的毛病, 08/21 23:49
→ hexjacal: 同張表出現的亂數是均勻的,但帶出來的遊戲結果卻不一定 08/21 23:50
→ hexjacal: 均勻,所以造成我模擬的結果與數學推論結果有很大差異 08/21 23:50
※ 編輯: hexjacal (114.26.137.84), 08/21/2014 23:52:49
→ azureblaze: 你沒考慮到亂數表是ABC的機率 08/22 00:05
→ azureblaze: 所以亂數要用srand初始化防止每次結果都是A 08/22 00:06
→ azureblaze: 此外樣本數越少本來就越容易和期望值差很遠 08/22 00:09
→ mike0227: 請去找Randomness tests的資料來看 08/22 01:13
→ mike0227: 你所謂 會造成遊戲結果差異的亂數 會有特定的pattern在 08/22 01:18
→ mike0227: 很多test都不會過的 08/22 01:19
→ wope: 兩隻Rand 就可以生山很多組的 亂數表了 09/08 06:41
→ wope: 兩隻Rand 就可以生出很多組的 亂數表 09/08 06:42
→ wope: int r=(int)(L[i]*(double)(rand()+0.5)/(RAND_MAX+1.0)); 09/08 09:15
→ wope: 我猜你是要產生UD但你Rand出來的東西要加0.5才是UD 09/08 09:17