2014-03-05 16 views
0

在這段代碼中,我想調用一個循環內的函數,在每次迭代中提供一個新的隨機數。但是,它不起作用,輸出總是相同的,如「2 2 2 2」或「5 5 5 5」。出了什麼問題?爲什麼函數不能在每個循環中提供新的值?

#include <iostream> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 

int vertex (int x) { 

srand(time(NULL)); 
x = rand()%10+1; 

} 


int main() 
{ 

const int size =4; 
int a; 
int arr[size]; 

for (int i=1;i<=size;i++){ 
     arr[i] = vertex(a) ; 
    cout << arr[i] << " "; 
    } 

return 0; 
} 

回答

1

你播種randtime(NULL),並沒有足夠的工作,這種價值正在做你的循環內改變。這導致該值在vertex的每次呼叫中恢復相同(即第一個值爲rand的種子編號爲time(NULL))。

而不是在vertex函數中播種它,而是在您的main函數中播種一次。

您還需要對代碼進行一些修改才能使其工作,因爲目前它不會編譯。

#include <iostream> 
#include <ctime> 
#include <cstdlib> 

using namespace std; 

int vertex() { 
    // x parameter removed, was not actually being used 
    return (rand() % 10 + 1); 
} 


int main() { 

    const int size = 4; 
    int a; 
    int arr[size]; 
    // seeding rand once, prior to usage 
    srand(time(NULL)); 
    // initial i value changed to 0, and changed condition to 'less-than', otherwise you'd end up trying to reference an invalid index (size is 4, index is 0-3) 
    for (int i = 0; i < size; i++) { 
     arr[i] = vertex(); 
     cout << arr[i] << " "; 
    } 

    return 0; 
} 
+0

它不會工作。在'int vertex(int x)'中,新的x值在離開函數時被丟棄。 – Avt

+0

它甚至不會編譯,因爲你的'int vertex(int x)'不返回任何東西。 – Avt

+0

啊,所以它是..我必須承認,自從我觸及C++以來已經有一段時間了。將更新我的答案。 – Seidr

0

你需要調用srand(time(NULL));只有一次

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

此外,改變你的函數:

int vertex() { 
    return(rand()%10+1); 
} 

第三,指出,可以通過在一個錯誤有過你的陣列。

for (int i=1;i<=size;i++){ 

更改爲:

for (int i=0;i<size;i++){ 
1

你不應該調用srand(time(NULL))內部功能vertex每次。

取而代之,將其稱爲一次,功能main(在循環之前)。

在你的代碼的附加(無關)的問題是:

for (int i=1;i<=size;i++) 

您需要將其更改爲:

for (int i=0;i<size;i++) 

最後,在功能vertex需要return x(雖然,我猜猜你只是忘了寫在你的問題上,因爲我看不到你的程序本來是如何被編譯的)...

0

1.你應該ld電話srand(time(NULL))只有一次!

2.Change您vertex功能

int vertex (int x) { 
    return rand()%10+1; 
} 

3. int arr[size];從0到size-1索引。更改

for (int i = 1; i <= size; i++) 

for (int i = 1; i < size; i++) 
相關問題