c 中生成隨機數時的種子問題,關於C 的隨機數的種子的設定問題

時間 2021-09-10 18:20:28

1樓:上上西

先糾正一下錯誤,是srand((unsigned int)time(0));srand的形參是unsigned int型別的;這句話只要寫一次,一般情況下只能寫一次;

隨機數是隨機的數,但計算機不可能產生隨機數,計算機根據你的輸入,再跟一個演算法就產生一個特定的序列.

只要你給計算機一個相同的數,計算機返回的就是一個特定的數,所以這樣的數叫做偽隨機數.

而srand(unsigned int par);這就是原型,這就是你給計算機的數.計算機通過rand()返回一個序列,假設是,只要給相同的引數, 這個序列是特定的.int a=rand();這時候a=2;所以可以得出只要每次給計算機不同的數也就是srand(unsigned int pra)也就是給pra是不同的值,我們就可以認為這個序列是隨機的.

要想給不同的值,最簡單的方法是把系統時間轉化成unsigned給計算機就可以了,因為每時每刻時間都是不同的.這裡要注意,時間是秒為單位,也就是說你如果srand((unsigned)time(null)); 只是在每一秒內取隨rand()的話,因為時間還沒來得及變,它還不是完全隨機的,在下一秒就會換取另一條序列,可以說是相對的隨機。這牽扯掉內部的東西,只要知道層面上的東西就夠了。

現在我來告訴你為什麼你得到了2組一樣的結果,因為計算機運算的速度是相當快的,你的2次srand()取值操作肯定是在一秒內之間發生的,第一次產生隨機數後,你又寫了一遍srand((unsigned)time(null)); 相當於根據時間又埋下了種子,而這次埋下的種子和上一次的種子是完全相同的,所以產生的序列也相同,於是計算機又按順序從頭開始把這條序列中的值取出來,產生了上述結果;

總結,在程式中只要寫一次srand((unsigned)time(null));

2樓:匿名使用者

srand(time(null));

只需要在main()函式中呼叫一次,如果每次取隨機數之前都呼叫srand()函式,那麼返回的隨機數順序是一樣的.

3樓:cpp門徒

// 其實一次兩次都是可以的。

你這個程式兩次都一樣,因為兩次srand()的時間太接近了,計算機速度這麼快,你兩次srand()的時間壓根就一樣,得到結果是一樣的。

如果你在中間sleep(1000)一下,結果自然就不一樣了。

// 給個例子你執行下。

#include

#include

#include

using namespace std;

int main()

sleep(1000); // 只在這裡+了這行,就可以實現不一樣了。

srand(time(0));

for(int ii=0;ii<10;ii++)return 0;

}+一次就可以了,系統會幫你自動選時間的。

有問題再hi我。

4樓:匿名使用者

標準庫(被包含於中) 提供兩個幫助生成偽隨機數的函式:

函式一:int rand(void) ;

從srand (seed)中指定的seed 開始,返回一個[ seed, rand_max (0x7fff) )間的隨機整數。

函式二:void srand(unsigned seed);

引數seed 是rand()的種子,用來初始化rand() 的起始值。

可以認為rand()在每次被呼叫的時候,它會檢視:

1) 如果使用者在此之前呼叫過srand(seed),給seed 指定了一個值,那麼它會自動呼叫srand(seed)一次來初始化它的起始值。

2) 如果使用者在此之前沒有呼叫過srand(seed),它會自動呼叫srand(1)一次。

根據上面的第一點我們可以得出:

1) 如果希望rand () 在每次程式執行時產生的值都不一樣,必須給srand(seed)中的seed一個變值,這個變值必須在每次程式執行時都不一樣(比如到目前為止流逝的時間) 。

2) 否則,如果給seed 指定的是一個定值,那麼每次程式執行時rand () 產生的值都會一樣,雖然這個值會是[seed, rand_max (0x7fff) )之間的一個隨機取得的值。

3) 如果在呼叫rand()之前沒有呼叫過srand(seed),效果將和呼叫了srand(1)再呼叫rand()一樣(1 也是一個定值)。

舉幾個例子,假設我們要取得0~6 之間的隨機整數(不含6 本身) :

例一,不指定seed:

for(int i=0;i<10;i++)

第一次執行時輸出:0 1 5 4 5 0 2 3 4 2

第二次:3 2 3 0 3 5 5 2 2 3

總之,每次執行結果將不一樣,因為每次啟動程式的時刻都不同(間隔須大於1 秒?見下)。

關於time_t time(0):

time_t 被定義為長整型,它返回從1970 年1 月1 日零時零分零秒到目前為止所經過的時間,單位為秒。比如假設輸出:

cout<

值約為1169174701,約等於37(年)乘365(天)乘24(小時)乘3600(秒)(月日沒算)。另外,關於ran_num = rand() % 6,將rand()的返回值與6 求模是必須的,這樣才能確

保目的隨機數落在[0,6) 之間,否則rand()的返回值本身可能是很巨大的。一個通用的公式是:要取得[a,b) 之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a 不含b) 。

在a 為0 的情況下,簡寫為rand() % b。

最後,關於偽隨機浮點數:

用rand() / double(rand_max)可以取得0~1 之間的浮點數(注意,不同於整型時候的公式,是除以,不是求模) ,舉例:

double ran_numf=0.0;

srand((unsigned)time(0));

for(int i=0;i<10;i++)

執行結果為:0.716636,0.457725,…等10 個0~1 之間的浮點數,每次結果都不同。如果想取更大範圍的隨機浮點數,比如1~10,可以將

rand() /(double)(rand_max) 改為rand() /(double)(rand_max/10)

執行結果為:7.19362,6.45775,…等10 個1~10 之間的浮點數,每次結果都不同。

至於100,1000 的情況,如此類推。

以上不是偽隨機浮點數最好的實現方法,不過可以將就著用用!

關於c++的隨機數的種子的設定問題

5樓:不眠夢鄉

不是的,

srand( time(null) ) ;    //設定隨機種子這個設定隨機種子的語句在程式裡面只要做一次就好了,並且不能被呼叫多次,

就好像你不能寫在 for( ) 語句裡,這樣就會每一次迴圈都會重新設定一次了,

當然就達不到你的效果了

#include

using namespace std ;

#include

#include

void f()

int main()

正確的應該這樣:

#include

using namespace std ;

#include

#include

void f()

int main()

嗯,我是直接在瀏覽器上打的,如果有語法錯誤執行不了,在問我。。。

c++中產生不重複的隨機數

6樓:匿名使用者

【解題思路】

這個題目要解決兩個問題:一是產生隨機數;二是不能重複。

●第一個問題:產生隨機數。在c++中要產生隨機數必須用到兩個函式:

srand()和rand()函式,使用這兩個函式必須包含標頭檔案 。其中rand()是產生一個偽隨機數,比如:int a=rand();函式返回值的取值範圍是int型別的取值範圍,如果要取得某個範圍的隨機數,可以通過取餘來實現,比如需要小於100的隨機數可以這麼寫:

int a=rand()%100;需要100-199之間的隨機數可以這麼寫:int a=100+rand()%100。但在使用這個函式之前,還必須通過srand()函式來指定一個隨機種子,如果沒有指定隨機種子,程式每次執行產生的隨機數系列和順序是相同的。

而且srand()指定了隨機種子之後,可以多次使用rand()函式來產生隨機數,而不必每次使用rand()都指定種子。為了確保程式每次執行時的隨機種子都不一樣,最好的辦法是使用系統時間作為隨機種子,比如:srand((int)time(null));

●第二個問題:不重複。這個問題系統沒有提供現成的函式,只能由程式設計者使用程式來實現。

實現的方法就是把每一個得到的隨機數儲存起來,然後當有新的隨機數產生的時候一個個比較,如果出現重複就重新產生隨機數。

像本題要求隨機輸出1-10十個不同的隨機數,就是既要限定範圍,又要不能重複,程式段如下:

【程式**】

#include //控制檯操作標頭檔案

#include //隨機函式標頭檔案

int main()                            //主函式

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第一次產生10個隨機數,因為沒有設定隨機種子,所以程式每次執行得到的數值都相同*/

srand((int)time(null));              //設定系統時間為隨機種子

printf("第二批十個隨機數(每次執行數值都不同):\n");

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第二次產生10個隨機數,因為設定系統時間為隨機種子,所以程式每次執行得到的數值都會不同,隨機種子只需設定一次,下面都不需要再設定*/

printf("第三批十個隨機數(10-29,可能重複):\n");

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第三次產生10個隨機數,因為設定了初始值並使用了取餘運算子,可以保證產生的隨機數在指定範圍內,因為沒有是否重複的判斷,多執行幾次,會發現這10個隨機數是可能重複的*/

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

{d[i]=10+rand()%20;                //得到隨機數

for(j=0;j

在EXCEL中生成隨機數的問題,excel怎麼在某一範圍內生成隨機數?

作輔助列,h列 選定h1 h50,輸入 randbetween 1000,9999 按ctrl enter 選定h51 h150,輸入 randbetween 10000,99999 按ctrl enter 選定h151 h250,輸入 randbetween 100000,999999 按ctrl...

怎麼用c 生成指定隨機數,在c 裡怎麼弄隨機數?

滄海雄風 include include include using namespace std int main srand unsigned time null 初始化時間種子 int ret rand 3 產生 0 1 2 三種隨機數 int real pow 2,ret 2的0次方 1 2的...

Php中生成6位隨機數並顯示

莫道無情 php中生成6位隨機數並顯示實現如下 1 使用shuffle函式生成隨機數。arr range 100000,999999 shuffle arr foreach arr as values echo values.顯示隨機數?2 使用array unique函式生成隨機數。arr arr...