兰德功能改进

时间:2013-06-19 00:59:30

标签: c

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

答案 0 :(得分:7)

rand()函数是伪随机数生成器,它使用上一代计算下一个值。通过使用srand()进行种子设定,您可以设置起始值,如果多次进行,则可以有效地“重置”随机数序列。在程序开头,而不是在每次调用srand()之前,将随机数生成器播种一次(使用rand())一个。

答案 1 :(得分:2)

srand(time(NULL))移至主方法中。这会在程序的入口点播种随机数生成器,允许每次调用rand()时检索其他随机数,并从其余数据中获取均匀分布。

答案 2 :(得分:2)

我认为问题在于,每次运行都会为PRNG的每次调用添加一个新值。看看srand() does here。您希望避免为每次调用播种PRNG的原因是因为您无法保证在下次调用rand()时生成的值均匀分布。您最有可能寻找的是,均匀分布值,并以这种方式使用srand()将产生意外结果。 This answer会提供有关您只应拨打srand()一次的原因的详细信息。

另外请记住,类似的规则适用于任何语言的任何PRNG,而不仅仅是C.

答案 3 :(得分:2)

您的程序运行得非常快,因此time每次调用时都会返回相同的值。由于传递给srand的值(s代表“种子”)确定了序列rand将产生什么,它产生相同的数字(初始数字或其他随机序列)每次在同一程序运行时,虽然数字应该在一秒钟后再次运行程序时发生变化。

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