2010-03-15 107 views
13
srand(time(NULL)); 
    for(i = 0; i < n; i++){ 
      for(j = 0; j < (n-1); j++){ 
       a[i][j] = rand(); 
      } 
     } 

我嘗試生成隨機數字,但它們是一樣的... 我該怎麼辦?C中的隨機數字

數組聲明:

int** a; 
int i; 
printf("Enter array size: "); 
scanf("%d", &n); 

a = (int**)calloc(n, sizeof(int)); 
for(i = 0; i < n; i++) 
    a[i] = (int*)calloc(n-1, sizeof(int)); 
+2

你的第一個'calloc'調用應該是'的sizeof(INT *)'但你似乎可正常工作的主機,其中簡單的指針和整數具有相同的尺寸(這是大多數系統架構中的真)上。 – mpez0 2010-03-16 00:33:24

回答

20

呼叫srand()外循環。您每次迭代都重新播種它。

srand()種子的隨機數發生器,所以你得到一個不同的序列隨機數取決於輸入。您的循環運行速度非常快,因此對time(NULL)的呼叫始終返回相同的值。每次迭代都重置爲相同的隨機序列。作爲一般規則,只需在程序中調用srand()一次。

+0

同意,你(通常)不應該需要多次播種隨機數發生器。 – bta 2010-03-15 18:28:37

+0

@bta:確實你不需要多次種子rand()。重新播種「適當的」隨機數發生器,我的意思是用於安全的任何事情,是另一回事。 – 2010-03-15 18:37:44

6

每次循環時都不要撥打srand() - 只需事先做好一次。

2
srand(time(NULL)); 

for(i = 0; i < n; i++){   
     printf("%d ", time(NULL)); 
     for(j = 0; j < (n-1); j++){ 
      a[i,j] = rand(); 
     } 
    } 

在循環之外調用srand一次。

+0

它不會幫助 – 2010-03-15 18:42:34

3

srand是「種子」隨機數發生器的功能。如果你不知道,計算機中的隨機數字並不是真正的隨機數。實際上,計算機只是有一個隨機的數字列表,並且您使用srand來告訴它從哪個列表開始,每次調用rand()時都會返回列表中的下一個項目。

你寫srand(time(NULL))的原因是爲了讓隨機數在每次運行程序時都不會相同的點上啓動(除非程序同時啓動)。

所以你在這裏做的是不斷地告訴程序在同一點重新啓動隨機數列表(因爲每次你經過循環的時間都是一樣的)。將呼叫轉移到循環外部的srand,您將得到正確的結果。

1

您需要在進入循環前致電srand()srand()用給定的種子初始化Radnom號碼生成器併爲此種子生成唯一的隨機數序列。

您的循環執行速度非常快,因此每次調用time(NULL)時都會產生相同的時間(以秒爲單位) - 因此您可以在每次循環迭代中使用相同的種子初始化隨機數生成器。

4

常見問題解答13.1513.20將會引起您的興趣。我很想爲這些問題創建一個新的標籤。

+0

也許創建一個題目爲「srand()如何影響隨機數生成器的狀態?」,並將其標記爲每次出現另一個細微變化時的副本;-) – 2010-03-15 18:39:49

+0

是的,CW版本。但是我們會複製所有的comp.lang。*。faqs,不是嗎? – dirkgently 2010-03-15 18:45:37

+1

是的,但是SO將不可避免地包含許多常見問題的重複項(按F的定義),所以無論你做什麼,都會複製comp.lang。*。faq。除非問題被無情地標記爲重複,不過,即使他們稍微改變了主題,他們最終的信息也會比現有的FAQ(假設FAQ涵蓋的內容很少)更少。常見問題解答的CW版本也可以標記爲SO,並鏈接到語言常見問題解答和任何其他相關資源,並可以以最一般的方式提出問題,以確保他們能夠捕獲最多的問題。或者其他的東西。 – 2010-03-15 20:12:47

0
srand(time(NULL)); 
for(i = 0; i < n; i++){ 
    for(j = 0; j < (n-1); j++){ 
     a[i,j] = rand(); 
    } 
} 

不管。數量是一樣的...

+0

這個'a [i,j]'語法是什麼?你可能希望'a [i] [j]',儘管你應該得到一個編譯器錯誤,除非j是一個普通的數組而不是像我相信你打算的那樣的二維數組。 – indiv 2010-03-15 18:50:27

+0

我沒有得到錯誤..但nubmers是相同的... – 2010-03-15 18:53:26

+0

顯示'a'的聲明。 – indiv 2010-03-15 18:54:19

0
int** a; 
int i; 
printf("Enter array size: "); 
scanf("%d", &n); 
if(n < 1){ 
    printf("Size should be > 0\n\n"); 
    return NULL; 
} 
a = (int**)calloc(n, sizeof(int)); 
for(i = 0; i < n; i++) 
    a[i] = (int*)calloc(n-1, sizeof(int)); 

這裏是我的數組...

+1

首先,您應該編輯您的帖子以添加此新信息。本網站不能像論壇一樣工作。其次,我支持我的陳述,即你的二維數組語法是錯誤的,你應該在訪問一個項目時做'a [i] [j]'。下面是一個多維數組教程:http://www.functionx.com/cpp/Lesson12.htm – indiv 2010-03-15 19:06:34

+0

編寫C代碼時,不需要使用「(int **)」。 – 2010-03-15 19:08:48

+0

我做了[a] [j]',但它沒有幫助.. – 2010-03-15 19:10:58

0

謝爾蓋,因爲這是一個完全有效的表達你沒有得到與a[i,j]版本只是一個錯誤消息。逗號運算符從左到右評估子表達式並返回最後一個表達式的值。因此,編寫a[i,j]a[j]相同。您在打印中收到的是指向矩陣中第j個向量的指針的值。