C++大隨機數的問題

發表於2017-01-08

C++的隨機數最大值是RAND_MAX,在標頭檔案中定義。

在windows平臺下的VS是0x7fff,在MacBook的XCode是int的最大值。看來不同的平臺是不同的。

但是windows的是在太他媽小了。

先上一個平時的隨機函式:

想優化一下:想著兩個相乘,最大值是1億,而且都是隨機,就應該是均等的。

於是我執行了100萬次,生成10以內的隨機數,統計一下出現的次數。

結果:

左邊的是大隨機數的次數,右邊的是原來的。

可以看出,右邊的比較正常,基本上是平均的。

而左邊的,明顯隔一個就大一點。等於1的特別高。至於怎麼產生的我也想不通。

不過可以想象一下,縮小範圍。就隨機1和2。

1和2的概率都是0.5,兩個數相乘是4.我們可以得到1-4範圍的隨機數。

但是概率明顯不是均等的。假如執行兩次,1和2都出現

就可以等到1:1次,2:2次,3:0次,4:1次。

明顯,相乘的肯定是有差別的.

來,再把小時候媽媽叫我的乘法口訣看一遍。

結果:

0     27

1     4

2     12

3     4

4     12

5     9

6     12

7     4

8     12

9     4

那應該怎麼搞呢,其實應該用移位的方法。你算出來的數是10進位制的話,每次向左移動1為,就是乘以10,例如我上面的程式碼,

10000以下和10000以上完全不相干,兩次隨機不相干。只有這樣才能使正確的隨機。

其實就是求模的時候,模式多少,第一次隨機就要乘以多少。rand1乘以的是rand2的模。

百度了一下其他人的隨機數。

還有這個簡單點的:

其實都是通過移位的方式,移出那個隨機數的最大值就行。

不過有個問題要考慮的,就是跨平臺問題。不同平臺的整形的長度可能不同,RAND_MAX也可能不同。總是移位,可能會出現陣列越界。

所以為了安全起見還是用我寫的兩個10000最大值的隨機數吧。

相關文章