2014-07-01 67 views
-1

我可能正在失明,每當我運行這個控制檯應用程序時,我都會得到相同的結果,儘管使用了隨機數。任何人都可以善意解釋我要去哪裏?下面是代碼:爲什麼我在循環中使用隨機數時會得到相同的結果?

#include "stdafx.h" 
#include <iostream> 
#include <math.h> 
#include <stdio.h> 

using namespace std; 

bool bacteria(long mut, long chance){ 
     bool result; 
    if (mut >= chance){ 
     result = true; 
    } 
    else{ 
     result = false; 
    } 
    return result; 
} 
int run = 1000000;//Number of iterations 
int mutations; 
int survival; 

void domutation(){ 
    mutations = 0; 
    survival = 0; 
    for (int i = 0; i < run; i++){ 
     long x = rand() % 2; 
     long y = rand() % 1000000; 
     bool run = bacteria(x, y); 
     if (run == true){ 
      mutations++; 
     } 
     else if (run == false) { 
      survival++; 
     } 
    } 
    cout << "Mutations: " << mutations << " Survivals: " << survival << endl; 
} 

int main(){ 
    for (int x = 0; x < 10; x++){ 
     domutation(); 
    } 
    int wait; 
    cin >> wait; 
} 

domutation的每個單獨的迭代()會產生不同的結果對上一次迭代,但每次我運行應用程序時,結果都是一樣的,因爲他們是我最後一次跑它,例如第一次迭代總是產生38個突變,而最後一次總是產生52個突變,並且兩者之間的變化不變。

我敢肯定我正在做一些dopey!

我在Windows 8.1中的VS 2013中工作。

謝謝!

+0

*啓動程序。您正在使用僞隨機數字。 – dyp

+2

您應該使用C++ 11''標題。 –

+0

您不播種隨機數發生器 – user1937198

回答

1

rand給你一個可預測的數字流。您需要播種它以在此流中選擇不同的點以啓動。假設你不會每秒鐘運行你的程序超過一次,目前的時間是一個便宜/容易的種子。

int main(){ 
    srand(time(NULL)); 
    for (int x = 0; x < 10; x++){ 
     domutation(); 
    } 

注意,如不提供種子「儘管使用隨機數」 *你*不使用隨機數*相當於總是srand(0)

+0

非常感謝。我對僞隨機數有錯誤的理解。這次真是萬分感謝。如果我想每秒鐘運行一次以上模擬,我需要做什麼?我不,但我很好奇...... –

+1

@GuyStimpson你需要找到一個種子,每秒更換一次以上。例如。 [gettimeofday](http://pubs.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html),它提供了微秒的分辨率。 – simonc

相關問題