2016-09-16 26 views
0

我試圖通過使用srand()rand()隨機生成數字,但沒有avale:每次運行該程序時,都會增加一定數量的數字。但是如果我使用for聲明,則無法看到任何模式。爲什麼我每次運行程序時「隨機」生成的數字都在增加?

例如,如果我使用下面提供的代碼並運行和關閉程序的10倍,輸出將是:

42 
52 
72 
78 
85 
92 
12 (it has reset) 
32 
48 

注意:一個奇怪的事情,我注意到這個,當我無焦點的或者最小化Visual Studio並關閉命令提示符,下一次運行該程序時數量會增加20多個,但是,如果我不關注或最小化Visual Studio,則該數字會比1-5稍微增加一點。爲什麼?

#include "stdafx.h" 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand (time(NULL)); 

    int random_number = rand() % 100 + 1; 
    cout << "Random number: " << random_number << endl; 

    return 0; 
} 

但是,如果我用這個代碼:

#include "stdafx.h" 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    srand (time(NULL)); 

    for (int i = 0; i < 10; i++) { 
     int random_number = rand() % 100 + 1; 
     cout << "Random number: " << random_number << endl; 
    } 

    return 0; 
} 

的數字不具有圖案清晰,我得到的輸出:

31 
10 
81 
66 
74 
14 
6 
97 
39 
23 

它們增加和減少隨機隨機數量。這裏似乎是什麼問題?

+2

有點不清楚。你是否因爲隨機數字是隨機的而感到困惑? –

+0

你的第二個例子似乎更隨機,因爲你重新使用相同的種子(如你應該),而不是基於快速連續的[幾乎]相同的輸入生成新的種子。 – TZHX

+0

它們在使用第二個代碼片段時是隨機的,但在使用第一個代碼片段時它們不是隨機的(它們增加了一定數量的數字並且不減少;僅重置)。 –

回答

2

rand(看着你的微軟)的某些版本返回的前幾個隨機數與它們開始的種子高度相關,只是由於使用了隨機數生成器公式。由於運行時間沒有太大變化,因此隨機數字也不會變化。如果你扔掉前幾個返回的隨機數,你可以得到更好的結果。

更好的解決方案是使用std::uniform_int_distribution而不是rand

+0

謝謝。我可能會在不久的將來看到這一點。 –

-1

另一個潛在的問題是rand的某些實現可能與某些模塊交互性較差。出於這個原因,你可能想考慮這樣的代替:

int v = ((double)rand()/(double)RAND_MAX) * 100 + 1; 

仍然不理想,但容易。

相關問題