給你看一段資料
在Adnrew和Barbara E.Moo所著的《Accelerated C++》7.4.4節,其中解釋了為什麼使用rand()——C標準隨機値生成器(standard random-value generator of C)——會造成問題。其本質描述於下:
使用rand()%n計算隨機數,這一技術顯示中會因以下兩個原因而失敗:
1.當商(quotient)被當作n且為小整數時,許多偽(pseudo)隨機數生成器製造出來的餘數(remainder)並不很隨機。例如rand()的連續執行結果非偶即奇(這並不十分罕見),這種情況下如果n是2,連續執行rand()%n獲得的不是0就是1。
2.另一方面,如果n是大數,且被生成之最大値並非均勻地(evenly)可被n除盡,那麼某些餘數(remainder)的出現率會遠高於其他。假設最大數是32767而n是2000,17個生成値(500,2500,...,30500,32500)將映射至500,而16個生成値(1500,3500,...,31500)映射至1500。這個情況在n愈大時愈糟糕。