2012-12-02 94 views
1

我有一個簡單的程序,以生成C.蘭特()行爲不理解

我使用rand()此隨機數N對。 N的值是一個命令行參數。

我注意到,當傳遞的命令行參數相同時,它總是生成相同的數字流。

rand()聯機幫助頁說,如果沒有明確的種子,則RNG隱式地按值1播種(在我的程序中沒有呼叫srand())。然而,當我用arg = 10調用我的程序,然後用arg = 12時,我應該看到兩個序列的前10個數字相等,對不對? (他們將使用相同的種子,即1)。這沒有發生。看起來這個種子是從隱含地通過的參數中導出和應用的,但這似乎不太可能。有任何想法嗎?

更新: [對不起,沒有張貼這早些時候]

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int objs=100, i; 
    if (argc >= 2) 
     objs = atoi(argv[1]); 

    for(i=0; i<objs; i++){ 
     int p = rand() % objs; 
     int q = rand() % objs; 
     printf("%d %d\n", p, q); 
     } 
     return 0; 
} 

我使用Ubuntu 12和gcc 4.7.2。

+7

我們不能調試我們看不到的程序。 –

+0

請發佈代碼。 –

+0

的#include 的#include INT主(INT的argc,字符* argv的[]){ INT OBJ文件= 100,I; if(argc> = 2) objs = atoi(argv [1]);對於(i = 0; i

回答

6

rand的int版本將生成從0到RAND_MAX的隨機數。這些整數將與相同的種子相同。但是,代碼中必須有另一步將該數字轉換爲範圍爲0-10或0-12的數字。這種縮放將負責不同的產出。

例如,如果它使用除法,蘭特返回25,則:

// for range 0..10, 
25/11 => 2 (truncated) 

// for range 0..12, 
25/13 => 1 (truncated) 
+0

我無法理解'rand()'結果的截斷差異如何影響'rand()'返回的後續值。 – user4815162342

+1

我看到OP的代碼後,回答了這個問題。 – iabdalkader

+2

是的。現在我們知道代碼使用了mod,這很清楚。假設第一個'rand()'返回20.'20%10'爲0,但'20%12'爲8.所以相同的隨機值會產生不同的輸出。 –

1

基於發佈的代碼,它出現在輸出的差是由於隨機數的模量來執行。

0

兩個序列的前10位是不相等的,因爲rand()返回相同的值(我們稱之爲a)用相同的種子(由srand()功能管理的),但聲明a % objs將返回取決於OBJ文件的值不同的值。請注意,a % 12的意思是除以12得到餘數,所以當%12和%10時,我們會得到不同的值。

希望這會幫助你