C 產生隨機數一直重複的問題

2021-09-24 20:51:29 字數 1263 閱讀 9475

c++產生隨機數,我們都知道,無非就是利用srand產生乙個種子,然後利用rand函式產生隨機數即可。但是今天在產生隨機數的時候遇到了乙個怪事,就是不管自己怎麼產搞,多次產生的隨機數都是重複的。自己的**簡化為下:

#include "stdafx.h"

#include #include #include class randomnum

};int main()

}

很簡單,就是在乙個類中,有乙個函式,在這個函式中產生隨機數然後輸出,來看一下輸出的結果:

對的,你沒看錯,雖然設定了種子,但是輸出的隨機數是唯一的(不設定種子輸出的隨機數也是唯一的,有興趣的話可以試一試)。

我們知道,srand()用來設定rand()產生隨機數時的隨機數種子。在呼叫rand()函式產生隨機數前,必須先利用srand()設好隨機數種子(seed), 如果未設隨機數種子, rand()在呼叫時會自動設隨機數種子為1(這也就是當我們不設定種子時,每次程式執行都會產生同樣的隨機數的原因)。進一步分析,我們在類裡面呼叫產生隨機數的函式以及設定種子的函式,那只要你的電腦足夠好,程式執行的足夠快,迴圈的每次(或者準確的說是前幾次)每次srand()函式中獲取的系統時間都是一致的,那麼執行每次rand函式之前,設定的種子都一樣,就和沒設定種子一樣了,這樣導致了產生的隨機數就是一樣的。

那解決辦法其實很簡單,就是不要將srand函式放在類的函式內部,最好把它放在主函式中,這樣就相當於設定了一次種子,但是產生了多次隨機數。而不是像上面的**一樣,每次設定一次種子,產生一次隨機數,然後設定的種子還一樣,產生的隨機數當然一樣了。

修改後的**如下:

#include "stdafx.h"

#include #include #include class randomnum

};int main()

}

看結果,產生的隨機數已經正常了。

當然,在c++11中,已經有產生隨機數的函式random,用法如下:

#include "stdafx.h"

#include #include int main()

這種方式產生的隨機數更好,如果能用這種方式的話,就盡量使用這種吧。

c 產生隨機數問題

對於產生隨機數的種子,一定要放在最外層函式,因為種子必須只有乙個,也就是說如果你要產生n個隨機數,也只需要乙個種子,即srand time 0 先舉個簡單的例子 define divisor 100 int mian int number 100 srand time 0 一定要放在最外邊,不能放在...

C 產生不重複的隨機數

方法1 思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數代替。int index...

c 隨機數產生

我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.net framework中提供了乙個專門用來產生隨機數的類system.random。對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結...