C 生成隨機數 生成任意範圍內的等概率隨機數

2021-08-25 16:01:42 字數 798 閱讀 1681

如果讓你用c++來生成0——n-1之間的隨機數,你會怎麼做?你可能會說,很簡單,看:

srand( (unsigned)time( null ) );

rand() % n;

仔細想一下,這個結果是隨機的嗎(當然,我們不考慮rand()函式的偽隨機性)?

不是的,因為rand()的上限是rand_max,而一般情況下,rand_max並不是n的整數倍,那麼如果rand_max % = r,則0——r之間的數值的概率就要大一些,而r+1——n-1之間的數值的概率就要小一些。還有,如果n > rand_max,那該怎麼辦?

下面給出一種比較合適的方案,可以生成任意範圍內的等概率隨機數 result。最後還有乙個更簡單的方法。

還有另外一種非常簡單的方式,那就是使用

random_shuffle( randomaccessiterator _first, randomaccessiterator _last ).

例如,生成0——n-1之間的隨機數,可以這麼寫

#include

#include

long myrandom( long n )

random_shuffle 還有乙個三引數的過載版本

random_shuffle( randomaccessiterator _first, randomaccessiterator _last, randomnumbergenerator& _rand )

第三個引數可以接受乙個自定義的隨機數生成器來把前兩個引數之間的元素隨機化。

這個方法的缺陷就是,如果只是需要乙個隨機數的話,當n很大時,空間消耗很大!

C 隨機生成區間範圍內的隨機數

要取得 a,b 的隨機整數,使用 rand b a a 要取得 a,b 的隨機整數,使用 rand b a 1 a 要取得 a,b 的隨機整數,使用 rand b a a 1 通用公式 a rand n 其中的a是起始值,n是整數的範圍。要取得a到b之間的隨機整數,另一種表示 a int b ran...

c 生成指定範圍內的隨機數

函式名稱 randgenerator 隨機數發生器 引數 dwrandmaxval 隨機數最大值 dwrandminval 隨機數最小值 dwrandcount 隨機數個數 mrandvalue 隨機數結果 itor first 儲存的隨機數 itor second 保留沒有 返回值 return ...

JS 生成某個範圍內的隨機數

math.ceil 向上取整。math.floor 向下取整。math.round 四捨五入。math.random 1.0 之間的乙個偽隨機數。包含0不包含1 比如0.8647578968666494 math.ceil math.random 10 獲取從1到10的隨機整數,取0的概率極小。ma...