是否有可能在C中增加srand(time(NULL))的刷新速度?

时间:2015-06-11 07:07:47

标签: c srand

我想看看是否有办法提高srand(time(NULL));功能“刷新”的速度?我理解srand()根据时间生成一个新的种子(所以每秒一次),但我正在寻找srand()的替代方案,它可以刷新间隔超过1秒。

当我运行我的程序时,它产生它应该的结果,但是种子基本上保持相同的一秒钟,所以如果程序每秒运行多次,结果保持不变。

很抱歉这么简单的问题,但我无法在网上找到专门针对C的答案。

4 个答案:

答案 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);
}