我感覺c語言的隨機數很奇怪,請大師詳答?

隨機數可能是我在c中最常用的功能。根據書本的要求,經常會加上srand((unsigned)time(NULL))語句放在即將運用隨機數語句之前的地方。可是即便如此,隨機數還是很不聽話。它顯得很不隨機,或者其值有規律可循(最恨這個,我希望是自然的高保真的隨機數),或者結果都是一樣的。比如說:我希望它們循環隨機(rand()%2)輸出Yes 或no,但是其結果總是全yes或全no,極偶爾的是隨機。是不是跟time()有關係?但是當我用rand輸出隨機數時倒是好不含糊,非常隨機,奇偶都有。為什麼


srand(time(NULL)); //設置隨機數生成器的seed,設置一次就夠了

rand(); //返回一個隨機數,要隨機數的時候調用這個就行。

================================================

update:

我猜你是這麼用的

while(expression)
{
srand((unsigned)time(NULL));
randomNumber=rand();
}

我們先來看看幾個函數的原型

void srand(unsigned int seed)

srand使用seed作為一個新的偽隨機數列的種子

int rand(void)

rand返回一個範圍在0到RAND_MAX的偽隨機整數。

time_t time(time_t *tp)

time返回當前的時間,當時間無效時返回-1,當tp不為NULL時,返回值同時賦給tp指向的內存單元。

注意:當前時間是指從1970年1月1日0:00:00 GMT到當前時間的秒數

在循環里,一個循環的時間是遠小於1s的,也就是在1s的時間內time(NULL)的返回值都是相同的。多次用同樣的seed初始一個新的偽隨機數列,rand()返回的值當然是相同的。(都是這個新數列的第一個值)。

解決辦法就是:

srand((unsigned)time(NULL));
while(expression)
{
randomNumber=rand();
}

srand一次就夠了。


「放在即將運用隨機數語句之前的地方」

srand一次就夠了。


推薦閱讀:

真實隨機數如何產生?為什麼說真實隨機數可以抵抗惡意攻擊?
一個無理數現有精度的下一位是否是隨機的?
可以通過未賦值的變數產生隨機數嗎?

TAG:編程 | C編程語言 | 隨機數 |