0

可能重复:
初始化 srand 的推荐方法?

在 c 中使用 srand() 时出现以下问题。

我在循环中调用 srand(time(NULL)) ,但循环在 1秒前结束,每次调用 rand() 时我都会得到相同的值。

我该如何解决这个问题?

4

6 回答 6

1

你为什么要srand循环调用?只需在程序开始时调用一次,然后调用rand任意次数。

于 2012-11-22T21:06:47.527 回答
0

不要在循环中调用 srand 。你为什么做这个?

只需在循环外初始化一次。

于 2012-11-22T21:07:03.080 回答
0

你只需要初始化srand()一次,然后你只需要用来rand()生成随机数。并生成随机数使用更好的随机算法?

如果要生成 1 到 10 之间的随机整数,则应始终使用高位来执行此操作,如

j = 1 + (int) ( 10.0 * ( rand() / ( RAND_MAX + 1.0 ) ) );
于 2012-11-22T21:08:15.087 回答
0

srand的目的是初始化随机数生成器。

它的参数称为种子。如果您两次提供相同的种子,您可以期望随机数生成器(随后调用rand())返回相同的“随机”数序列。

在你的情况下,你不断地用相同的值调用 srand (直到第二次改变),所以 rand() 总是会返回相同的值。

您只需要调用srand一次。

于 2012-11-22T21:13:02.097 回答
0

因为种子被绑定到 time() 中,这是自 unix 纪元以来的秒数,所以基本上你给它相同的种子,因为循环花费的时间不到一秒。

你应该做的是以微秒为单位获取时间。看看 gettimeofday() 如果你正在为 windows google microseconds win32 C 编写代码,你需要将它从双精度转换为整数所以只需执行此操作 (unsigned int)double * 100.0f;

于 2012-11-22T21:24:19.180 回答
0

在您的帮助下,我找到了答案。

        struct timeval tv;
        gettimeofday(&tv,NULL);
        unsigned long time_in_micros = 1000000 * tv.tv_sec + tv.tv_usec;//find the microseconds for seeding srand()
        srand(time_in_micros);
于 2012-11-22T21:47:32.367 回答