我想看看是否有办法提高srand(time(NULL));
功能“刷新”的速度?我理解srand()
根据时间生成一个新的种子(所以每秒一次),但我正在寻找srand()
的替代方案,它可以刷新间隔超过1秒。
当我运行我的程序时,它产生它应该的结果,但是种子基本上保持相同的一秒钟,所以如果程序每秒运行多次,结果保持不变。
很抱歉这么简单的问题,但我无法在网上找到专门针对C的答案。
答案 0 :(得分:3)
srand(time(NULL));
不是函数,而是两个函数:time()
,它返回自纪元以来的当前时间(以秒为单位);和srand()
初始化随机数生成器的种子。您正在将rendom数字生成器的种子初始化为当前时间(以秒为单位),这是非常合理的事情。
但是,您有几个误解,实际上只需要运行srand
一次,或者每隔几分钟运行一次,之后rand()
将继续自行生成更多随机数,{{ 1}}只是为rand设置一个初始种子。
其次,如果你确实想要这样做,我不明白为什么你会使用一个能够将时间恢复到更高精度的函数。为此我建议srand()
。
答案 1 :(得分:3)
您可以尝试从其他来源获取种子值。例如,在unix系统上,您可以从/ dev / random:
中获取一个随机的四字节值void randomize() {
uint32_t seed=0;
FILE *devrnd = fopen("/dev/random","r");
fread(&seed, 4, 1, devrnd);
fclose(devrnd);
srand(seed);
}
答案 2 :(得分:3)
在Windows下,您可以使用GetTickCount()
代替time()
。它以50ms的间隔变化(如果记错的话)。
答案 3 :(得分:0)
我遇到了同样的问题,我用 high resolution clock 找到了一个简单的解决方法。
#include <chrono>
#include <random>
int main() {
long long t1 = std::chrono::high_resolution_clock::now().time_since_epoch().count();
std::srand((unsigned int)t1);
}