簡體   English   中英

蘭德功能改進

[英]Rand function improvement

我的代碼初始化一個指向隨機名稱的指針。 隨機名稱是使用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;
}

rand()函數是一個偽隨機數生成器,它使用上一代來計算下一個值。 通過使用srand()播種,您將設置起始值,如果您多次執行,則可以有效地“重置”隨機數序列。 在程序開始時將隨機數生成器播種一次(使用srand() ),而不是在每次調用rand()之前播種。

srand(time(NULL))到main方法中。 在程序的入口點播種隨機數生成器,允許在每次調用rand()時檢索其余的隨機數,其中包含其余的偶數分布。

我認為問題在於,每次運行都會為PRNG的每次調用添加一個新值。 看看srand()在這里做了什么。 您希望避免為每次調用播種PRNG的原因是因為您無法保證在下次調用rand()生成的值均勻分布。 你最有可能尋找的是,均勻分布值,並以這種方式使用srand()將產生意想不到的結果。 這個答案將提供更多詳細信息,說明為什么你應該只調用一次srand()

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

您的程序運行速度非常快,因此每次調用time返回相同的值。 由於傳遞給srand的值( s代表“種子”)決定rand將產生什么序列,因此每次在同一程序運行中產生相同的數字(初始數字或其他隨機序列),盡管數字應該是一段時間后再次運行程序時會有所不同。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM