2013-05-02 91 views
2

下面但它總是給我42作爲SIZE。我想用srand(time(NULL))隨機化SIZE,但顯然它不起作用,因爲它低於SIZE的隨機化。當我在SIZE的隨機化之前嘗試添加它時,編譯器向我大喊。你有任何想法如何糾正它?srand()在隨機初始化陣列下工作不起作用

int i,numberToBeFound; 
int SIZE=(rand()%100)+1; // size can be in the range [1 to 100] 
int *array2 = (int*) malloc(sizeof(int)*SIZE); 

srand(time(NULL)); 

for(i=0;i<SIZE;i++)  //fill the array with random numbers 
    array2[i]=rand()%100; 
+3

使用'rand()'調用'srand' _before_。 – 2013-05-02 18:35:06

+0

它給了我15個錯誤和9個警告如果我這樣做 – Lyrk 2013-05-02 18:37:11

+2

我認爲當他將srand移動到rand以上時,他看到的錯誤是聲明之前的代碼。 – 2013-05-02 18:37:53

回答

3

您需要之前調用srand()你叫rand()初始化隨機數發生器。

你可以試試srand(time(NULL))這會給你一個不同的結果每秒一次。如果你需要它比這個更可變,那麼你將不得不想出一個更好的方法來產生數字生成器。

int i,numberToBeFound; 
int SIZE; 
int *array2; 

srand(time(NULL)); 

SIZE=(rand()%100)+1; // size can be in the range [1 to 100] 
array2 = malloc(sizeof(int)*SIZE); 

for(i=0;i<SIZE;i++)  //fill the array with random numbers 
    array2[i]=rand()%100; 

PS:你不應該用C投malloc() - 見this post

+0

他叫'srand(time(NULL))';問題在於,在調用rand()初始化SIZE之後,他會這樣做。 (你的代碼調用'srand()'兩次,這很少是個好主意。) – 2013-05-02 18:36:34

+0

啊...... doh。一旦我看到他還沒有調用'srand()',我沒有看過'rand()'調用。 〜lol〜據此編輯。 – 2013-05-02 18:38:46

+0

我已經知道我必須在rand之前調用srand,但是因爲我使用的是Visual Studio,所以當我在rand之前放置srand時,編譯器不接受它。我問是否有解決方法。 – Lyrk 2013-05-02 18:38:50

4
int i, numberToBeFound; 
int SIZE=0; 
int* array2=0; 

srand(time(NULL)); 

SIZE=(rand()%100)+1; // size can be in the range [1 to 100] 
array2 = (int*) malloc(sizeof(int)*SIZE); 

for(i=0;i<SIZE;i++)  //fill the array with random numbers 
    array2[i]=rand()%100; 

它是古老的C(C89或更老)。所以申報你的當地人,然後初始化他們,最後根據需要使用他們。

+0

這仍然沒有隨機化SIZE,因爲種子是在rand調用之後完成的。 – typ1232 2013-05-02 18:39:22

+0

您仍然在'srand()'之前調用'rand()'。它不是C,它是C89 [過時,無效,不好]。 – 2013-05-02 18:39:33

+1

這不是問題......問題是他沒有在**之前調用'srand()'**他叫'rand()' – 2013-05-02 18:39:35

3

您在評論中說,如果您在rand()之前致電srand(),則編譯器不會接受它。

這是因爲您的編譯器(Microsoft?)正在執行C89/C90規則,這些規則不允許聲明在塊內遵循語句。

您可以通過添加新塊來解決該限制。粗線條:

srand(time(NULL)); 
{ 
    int size = rand() % 100 + 1; 
    /* ... */ 
} 

或者,你可以調用srand()後刪除初始化爲sizearray2,與分配替換它們。就個人而言,我傾向於儘早初始化變量。

一般來說,在撥打rand()之前,您應該只在您的程序中撥打srand()一次。 (這是最常見的情況下,你想要非重複的僞隨機數;如果你真的需要一個可重複的序列,一個不同的策略是適當的)。所謂srand(1),併產生相同的序列每次)

(我已經改變了你的變量SIZEsize的名稱;全大寫的標識符通常用於宏)

+0

代碼的一些小的重新排序是所有需要的。 – StarPilot 2013-05-02 18:43:54

+0

這真是太棒了,謝謝 – Lyrk 2013-05-02 18:49:22

+0

,srand的功能創造是天才,成爲一種解決方法。謝謝 – Lyrk 2013-05-02 19:03:17

1

拿不到總是與rand相同的結果,您需要使發電機與一起播種在撥打電話rand之前,請撥打。因此,您只需在致電rand之前將您的srand呼叫轉移到某個地方。