【问题标题】:Feeding srand() with time function for Windows用 Windows 的时间函数喂 srand()
【发布时间】:2012-09-12 14:49:50
【问题描述】:

我一直在寻找下面代码补丁的精确 Win 实现。我不是一个优秀的程序员,我的代码最初是在 UNIX 中,但我必须尽可能少地修改它以用于 Win。我从一些谷歌搜索中了解到,主要问题是没有 Win 等效项的“gettimeofday”。但是我想尽可能地保留相同的程序结构。

struct timeval tv;
time_t curtime;
gettimeofday(&tv, NULL);    // ???
curtime = tv.tv_usec;
srand(tv.tv_usec); //time(&curtime)

【问题讨论】:

  • 通常srand(time(0)) 就足够了,你不需要亚秒级的分辨率来播种 PRNG,除非你希望每秒启动/停止程序几次。
  • 将输出示例添加到该函数的控制台,就好像已经存在于 windowze 或您从 Unicse 运行一样
  • 您清楚地了解这段代码的作用和原因吗?如果您只需要播种伪随机生成器,常用方法是以秒为单位使用当前 UTC 时间:srand(time(NULL)),它适用于 UNIX 和 Windows。为什么你需要 tv.tv_usec 那只是微秒的休息时间?
  • @Rost:OP 很可能在第 9 频道观看了 Stephan Lavavej 关于rand 的演讲,其中谴责rand 共同使srand(time(0)); 成为一个大WTF,原因是所有程序都启动了在同一秒内获得相同的种子(对于大多数东西来说可能不是问题,但他在技术上是正确的)。

标签: c++ time visual-studio-2012 gettimeofday


【解决方案1】:

如果您需要将随机种子作为亚秒数,请执行以下操作:

#ifdef WIN32
::srand( GetTickCount() );
#else
//your existing code
#endif

【讨论】:

    【解决方案2】:

    您可以使用 Windows 原生函数 GetSystemTimeAsFileTime() 来获取时间并编写一个包装器将其放入 struct timeval 结构中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多