2013-06-19 77 views
2

我的代碼初始化一個指向隨機名稱的指針。隨機名稱是使用rand函數隨機選擇的。Rand功能改進

我注意到rand函數並沒有完全做我想做的事情。在下面的代碼中,它將初始化所有具有相同名稱的指針!我懷疑這對於基於時間函數選擇的rand函數是有用的。如果它一次初始化所有的指針,它會產生相同的隨機數!我敢肯定,時間戳需要時間來產生另一個數字嗎?我可以通過在循環中運行初始化來修復代碼,但我想知道另一種解決方法,因爲有時需要幾秒鐘才能完成循環。

參考:

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

int random_number(int, int); 
const char *random_name(); 
//---------------------------------------------------------------- 
int main(void) 
{ 
    const char * kg = NULL; 
    const char * ke = NULL; 
    const char * dg = NULL; 
    const char * de = NULL; 

    kg = random_name(); 
    ke = random_name(); 
    dg = random_name(); 
    de = random_name(); 

    printf("kg=%s\nke=%s\ndg=%s\nde=%s\n", kg, ke, dg, de); 

    return 0; 
} 
//---------------------------------------------------------------- 
const char *random_name(int x) 
{ 
    const char *names[7] = 
    {"Bob", "Billy", "Buck", "Bobby", "Bill", "Billy Bob", "Bobi"}; 

    int roll = random_number(0,7); 
    return names[roll]; 
} 
//---------------------------------------------------------------- 
int random_number(int min, int max) 
{ 
    int roll; 
    int maximum = max - min; 
    srand(time(NULL)); 
    roll = (rand() % maximum) + min; 
    return roll; 
} 
+6

在每次調用rand()之前都不要播種。在程序啓動時只需調用'srand'。 – Anthony

+1

請考慮使用更有意義的變量名稱。 – icedwater

+0

我在最終的程序中使用了更有意義的變量名稱。那些短暫和無意義的原因是因爲他們沒有評論,並且應該是短暫的,因爲我會使用它們一百次。但我也認爲變數應該有很好的名字。 – Samuel

回答

7

rand()功能是使用前代計算下一個值的僞隨機數發生器。通過播種srand(),您正在設置起始值,並且如果您多次執行有效「重置」隨機數字序列的操作。在您的程序開始時將隨機數生成器播種一次(使用srand()),而不是在每次調用rand()之前。

2

srand(time(NULL))移動到您的主要方法中。在程序的入口點播放隨機數發生器,從而允許每次調用rand()時從其餘的均勻分佈中獲取不同的隨機數。

2

我相信問題在於,您在每次運行時都會給每個PRNG呼叫一個新值。看什麼srand() does here。您希望避免爲每個電話撥種PRNG的原因是因爲您不能保證在下次撥打rand()時生成的值均勻分佈。你最可能尋找的是,即使分配價值,並以這種方式使用srand()將產生意想不到的結果。 This answer將提供更多的細節,爲什麼你只能撥打srand()一次。

的同時也要記住,類似的規則將適用於任何PRNG任何語言,而不僅僅是C.

2

你的程序運行速度很快,所以time每次調用時返回相同的值。由於傳遞給srands代表「seed」)的值決定了rand將產生的序列,它會在同一程序運行中每次產生相同的編號(初始編號或其他隨機序列),但編號應該稍後再次運行該程序時會有所不同。

正如其他人所提到的,解決方案是在main的開頭調用srand

+0

+1解釋爲什麼OP有「同名!」。 – chux