C 中產生一定範圍內的隨機數

2021-05-23 15:58:00 字數 798 閱讀 4416

如果讓你用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很大時,空間消耗很大!

在一定範圍內生成隨機數

問題 給定乙個最小正整數和乙個最大正整數,如何在它們之間生成隨機數 包含上下界 1 它生成的隨機數範圍是 0,2 它所使用數值的型別是uint32,並不是int,因此需要做型別轉換。因為使用arc4random uniform 函式生成的隨機數不包含上界,但是我們的題目要求包含上界,所以在上下界相減...

C 生成一定範圍內固定個數的隨機數

隨機數 在某次產生過程中按照實驗過程中表現的分布概率隨機產生的,其結果是不可 的,是不可見的。一般使用的是偽隨機的。常使用函式rand 產生隨機數,但是隨機數值的範圍在0至rand max 間,rand max與使用資料型別有關。int randnum 10 for int i 0 i randnu...

VC 6 0獲取一定範圍內的隨機數

int irand1 irand1 rand 100 1 隨機產生1 100 include 包含標頭檔案time void main 再舉個例子 如果想產生3 15的隨機數就這麼寫a rand 12 3 1 rand返回0 rand max之間均勻分布的偽隨機整數。rand max必須至少為327...