【问题标题】:Get lower value than seconds获得低于秒的价值
【发布时间】:2014-05-09 09:27:52
【问题描述】:

我知道time(0) 会在几秒钟内返回,但有没有办法让它返回更小的值?我认为它们被称为毫秒,但不确定。我需要将它传递给srand()

原因是我让 2 个线程相互通信,但它们的通信速度非常快,以至于它们每秒向彼此发送大约 30 条相同的消息,我需要这些随机数不同,因此每个“毫秒”都有不同的种子

【问题讨论】:

  • 你的编译器支持 C++11 吗?特别是带有 std::chrono::high_resolution_clock::now? 的库 std::chrono
  • 不要多次致电srand。每次执行此操作时,都会有效地重置随机生成器。

标签: c++ random time


【解决方案1】:

您的错误似乎是您尝试多次调用srand()

详细解释请看这个问题:srand() -- why call only once?

【讨论】:

  • 啊,我明白了。我在同一秒内生成了大约 30 次相同的种子。
【解决方案2】:

假设您在符合 POSIX 的环境中,您可以使用 gettimeofday

struct timeval tv;
suseconds_t microseconds;

gettimeofday(tv, NULL);

microseconds = tv.tv_usec;

【讨论】:

    【解决方案3】:

    您的要求完全取决于系统。在过去,大多数系统以毫秒为单位计算时间。例如,VMS 操作系统使用以毫秒为增量的 8 字节时间。

    当 Unix 开始流行时,库开始使用秒来跟随它。

    如上所述,您可以在 posix 上获得毫秒数。 苹果也有 NSDate 和 CACurrentMediaTime。 Windoze 有 GetTickCount 和其他一些。

    【讨论】:

      【解决方案4】:

      如果您需要两个线程使用伪随机数进行通信,您应该使用两个独立的流,每个流只使用不同的随机种子播种一次。有许多 C/C++ 库可以做到这一点,但使用标准 C rand/srand 并不是其中之一。即使您只正确调用 srand() 一次,在两个线程中使用相同的随机流也会导致可预测的(即非随机)行为。

      使用更好的生成器,并为其植入一些真实的系统随机性——在真实计算机上是 /dev/random,在 Windows 上是 CryptGenRandom。

      【讨论】:

        【解决方案5】:

        对此没有标准的 C/C++ 函数。但通常操作系统提供这样的功能。

        在 Linux 中有 gettimeofday 函数。 并且Windows上有GetSystemTime函数。

        http://linux.die.net/man/2/gettimeofday http://msdn.microsoft.com/en-us/library/windows/desktop/ms724390(v=vs.85).aspx

        也许还有其他一些功能......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-07
          • 2015-09-16
          • 2012-03-20
          • 2013-02-19
          • 1970-01-01
          • 2011-03-07
          • 2019-06-24
          相关资源
          最近更新 更多