我感覺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一次就夠了。
推薦閱讀:
※真實隨機數如何產生?為什麼說真實隨機數可以抵抗惡意攻擊?
※一個無理數現有精度的下一位是否是隨機的?
※可以通過未賦值的變數產生隨機數嗎?