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