為什么srand()放在for回圈里面和外面輸出來的結果不一樣,放在外面輸出來的就是10個亂數,放在里面輸出來的就全是5,或全是2.。。


#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int a[10];
int i;
srand((time(NULL)));
for (i = 0; i < 10; i++)
{
//srand((time(NULL)));
a[i] = rand()%10;
}
for (i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
getchar();
return 0;
}
uj5u.com熱心網友回復:
在C++中產生亂數的步驟分為兩步:第一步是設定起始數;第二步是產生偽亂數。srand()函式的作用是設定起始數,當起始數相同時,產生的亂數也是相同的,在for回圈內部,您每次呼叫time()函式獲取的時間都相同(for回圈消耗的時間太短),即起始數是相同的,所以您獲取到的亂數也是相同的。可以考慮在for回圈中加一個延遲函式,例如
for (i = 0; i < 10; i++)
{
srand((time(NULL)));
a[i] = rand() % 10;
Sleep(1000);//-------延遲1秒---------
}
這樣,每次呼叫time得到的就是不同的時間了,因此也會得到不同的亂數。需要注意的是,使用Sleep()函式,需要
#include <Windows.h>
另外,對于srand()函式和rand()函式產生亂數的詳細方法,請參考《C++中產生隨機整數的方法(srand()函式與rand()函式)》
希望能夠幫到您!
uj5u.com熱心網友回復:
The srand() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by rand(). These sequences are repeatable by calling srand() with the same seed
value
srand是生成亂數的種子,如果放在回圈里,那么就是種子跟著變化,那么生成的就是相同序列的數值。
uj5u.com熱心網友回復:
謝謝各位了,明白了uj5u.com熱心網友回復:
srand是設定亂數的種子,正常情況下,這個函式不應當過于頻繁的呼叫,一般程式運行時初始化一次即可。
uj5u.com熱心網友回復:
C:\Program Files (x86)\Windows Kits\10\Source\10.0.10150.0\ucrt\stdlib\rand.cpp//
// rand.cpp
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines rand(), which generates psuedorandom numbers.
//
#include <corecrt_internal.h>
#include <stdlib.h>
// Seeds the random number generator with the provided integer.
extern "C" void __cdecl srand(unsigned int const seed)
{
__acrt_getptd()->_rand_state = seed;
}
// Returns a pseudorandom number in the range [0,32767].
extern "C" int __cdecl rand()
{
__acrt_ptd* const ptd = __acrt_getptd();
ptd->_rand_state = ptd->_rand_state * 214013 + 2531011;
return (ptd->_rand_state >> 16) & RAND_MAX;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/14249.html
標籤:C語言
上一篇:幫忙看一下這段內嵌匯編的代碼
