【问题标题】:Is it possible to increase the refresh speed of srand(time(NULL)) in C?是否可以提高 C 中 srand(time(NULL)) 的刷新速度?
【发布时间】:2015-06-11 07:07:46
【问题描述】:

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

当我运行我的程序时,它会产生应有的结果,但种子基本上在一秒钟内保持不变,因此如果程序每秒运行多次,结果将保持不变。

抱歉这么简单的问题,但我在网上的任何地方都找不到专门针对 C 的答案。

【问题讨论】:

  • 如果您需要超过秒的精度,请使用从gettimeofday() 派生的一些值而不是time()。这与srand 完全正交。
  • The appropriate choice of function will be operating system dependent
  • 另外:如果您担心随机数的质量,do not use rand
  • random.org获取随机数据(使用证书认证防止MotM攻击)

标签: c srand


【解决方案1】:

您可以尝试从其他来源获取种子值。例如,在 unix 系统上,您可以从 /dev/random 中获取一个随机的四字节值:

void randomize() {
  uint32_t seed=0;
  FILE *devrnd = fopen("/dev/random","r");
  fread(&seed, 4, 1, devrnd);
  fclose(devrnd);
  srand(seed);
}

【讨论】:

  • 另外,你不想使用加法,你想使用按位或。
  • 值得注意的是,这依赖于某种 ​​UNIX,例如 OS。
【解决方案2】:

srand(time(NULL)); 不是一个函数,而是两个函数:time() 返回从纪元以来的当前时间(以秒为单位);和srand() 初始化随机数生成器的种子。您正在将随机数生成器的种子初始化为当前时间(以秒为单位),这是一件非常合理的事情。

但是你有几个误解,你实际上只需要运行一次srand,或者最多每隔几分钟运行一次,之后rand()会继续自己生成更多的随机数,srand()只是为了为 rand 设置一个初始种子。

其次,如果你真的想这样做,虽然我不明白你为什么会使用一个函数来将时间返回到更高的精度。为此,我建议gettimeofday()

【讨论】:

  • so if the program is run multiple times a second---与您的第二段相矛盾。我相信 OP 并没有在代码本身中多次调用 srand(),程序正在运行多次。
  • @SouravGhosh 我是说这样做是错误的方法,用户应该将程序每次运行的时间更长,并且只运行 rand() 以获得更多随机数。让我说得更清楚
  • 好吧,我没有说你错了,只是说不要像the user should be persisting the program each run for longer那样提出更改。这真的取决于程序的性质,不是吗?
  • @SouravGhosh 确实如此,但事实上 rand() 不应该用于任何东西,除了玩具程序。我假设用户只是想学习一些基本的 C 语言,并且对程序的工作方式有一定的灵活性。
  • hmm.. 我认为 rand() 在正确使用时是可靠的。我很感兴趣。你能指出一些链接,在那里我可以阅读到在实际程序中使用rand() 的缺点吗?
【解决方案3】:

在 Windows 下,您可以使用 GetTickCount() 代替 time()。它以 50 毫秒的间隔变化(如果没记错的话)。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,我找到了一个简单的解决方法,使用 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2014-11-30
      • 2013-03-18
      • 1970-01-01
      • 2021-12-15
      • 2020-07-25
      • 1970-01-01
      相关资源
      最近更新 更多