作者tropical72 (藍影)
站內C_and_CPP
標題[問題] 亂數測試問題
時間Fri Mar 18 17:46:56 2011
※ [本文轉錄自 Prob_Solve 看板 #1DWodeMF ]
os: xp, compiler: vc2008
小弟為測亂數品質(均勻度),使用以下方式記錄亂數出現數字
unsigned char* occ_times = (unsigned char*)malloc(RAND_MAX+1);
memset(occ_times, 0, RAND_MAX+1);
srand((unsigned)time(NULL));
for(i=0; i!=RAND_MAX+1; ++i) ++occ_times[rand()];
不過測出來效果似乎不好, 因去看結果時
unsigned not_cnt_one=0;
for(i=0; i!=RAND_MAX+1); ++i){
if(occ_times[i]!=1) ++not_cnt_one;
}
RAND_MAX = 32767, 出來的 not_cnt_one 高達 20000,
幾乎為 2/3, 而另一測試是測 "多久會開始重覆數字",
理想為 RAND_MAX ,但實際上卻只有 100~400 次不等。
我想內建的 rand() 品質應沒這麼不好吧 ?
故想請教各位有經驗之先進,是否我的測試出了什麼問題?
謝謝各位不吝指教
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.72.67
※ 編輯: tropical72 來自: 180.177.72.67 (03/18 17:47)
推 LPH66:「數字重覆出現」和「週期重覆」是不一樣的兩件事喔... 03/18 18:24
→ LPH66:而且週期也不一定是 RAND_MAX 可以更長 03/18 18:25
→ tropical72:請教LPH66版大,這部份若是要算「週期重覆」是否有現有 03/18 18:36
→ tropical72:之演算法該參閱? 03/18 18:36
→ loveme00835:unsigned char c = RAND_MAX; ← 這樣會取 MOD 03/18 19:27
→ loveme00835:拍謝我看錯... 03/18 19:28
→ tropical72:love大5F的式子我想了一下,還蠻有趣的..(c=0xff) 03/18 19:52
推 ericinttu:剛剛用win7+VC2008, not_cnt_one 也是2萬初 03/18 20:16
→ tropical72:to eric~:抱歉,這篇我的測試立足是錯的,在 Prob_Solve 03/18 20:22
→ tropical72:已有人指定,所以這部份我還得想辦法重新設計測試. 03/18 20:23
→ tropical72:謝謝您幫忙實際測試 ^^ 03/18 20:23
推 ericinttu:對厚 果然一起走錯路了 XDDD 03/18 20:24