2

我的代码初始化了一个指向随机名称的指针。随机名称是使用 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;
}
4

4 回答 4

7

rand()函数是一个伪随机数生成器,它使用上一代计算下一个值。通过与srand()您一起播种来设置起始值,如果您多次这样做,您可以有效地“重置”随机数序列。在程序开始时(srand()而不是在每次调用rand().

于 2013-06-19T01:06:23.843 回答
2

您的程序运行得非常快,因此time每次调用时都返回相同的值。由于传递给的值srands“种子”的代表)决定了rand将产生什么序列,因此每次在同一程序运行中它都会产生相同的数字(初始数字或其他随机序列),尽管当您运行时数字应该会有所不同一秒钟后再次运行该程序。

正如其他人所提到的,解决方案是srand在开头调用main

于 2013-06-19T01:19:11.723 回答
2

进入srand(time(NULL))你的主要方法。这会在程序的入口点为随机数生成器播种,从而允许每次rand()调用时检索到的具有与其余随机数均匀分布的不同随机数。

于 2013-06-19T01:06:42.757 回答
2

我认为问题在于您在每次运行时为每次调用 PRNG 提供了一个新值。看看srand()这里有什么。您希望避免在每次调用时播种 PRNG 的原因是因为您无法保证在下一次调用时生成的值rand()是均匀分布的。您最有可能寻找的是值的均匀分布,并srand()以这种方式使用会产生意想不到的结果。这个答案将提供更多关于为什么你应该只打电话srand()一次的细节。

还要记住,类似的规则将适用于任何语言的任何 PRNG,而不仅仅是 C。

于 2013-06-19T01:06:45.040 回答