可能重复:
初始化 srand 的推荐方法?
在 c 中使用 srand() 时出现以下问题。
我在循环中调用 srand(time(NULL)) ,但循环在 1秒前结束,每次调用 rand() 时我都会得到相同的值。
我该如何解决这个问题?
可能重复:
初始化 srand 的推荐方法?
在 c 中使用 srand() 时出现以下问题。
我在循环中调用 srand(time(NULL)) ,但循环在 1秒前结束,每次调用 rand() 时我都会得到相同的值。
我该如何解决这个问题?
你为什么要srand
循环调用?只需在程序开始时调用一次,然后调用rand
任意次数。
不要在循环中调用 srand 。你为什么做这个?
只需在循环外初始化一次。
你只需要初始化srand()
一次,然后你只需要用来rand()
生成随机数。并生成随机数使用更好的随机算法?
如果要生成 1 到 10 之间的随机整数,则应始终使用高位来执行此操作,如
j = 1 + (int) ( 10.0 * ( rand() / ( RAND_MAX + 1.0 ) ) );
srand
的目的是初始化随机数生成器。
它的参数称为种子。如果您两次提供相同的种子,您可以期望随机数生成器(随后调用rand()
)返回相同的“随机”数序列。
在你的情况下,你不断地用相同的值调用 srand (直到第二次改变),所以 rand() 总是会返回相同的值。
您只需要调用srand
一次。
因为种子被绑定到 time() 中,这是自 unix 纪元以来的秒数,所以基本上你给它相同的种子,因为循环花费的时间不到一秒。
你应该做的是以微秒为单位获取时间。看看 gettimeofday() 如果你正在为 windows google microseconds win32 C 编写代码,你需要将它从双精度转换为整数所以只需执行此操作 (unsigned int)double * 100.0f;
在您的帮助下,我找到了答案。
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);