【问题标题】:How to generate random 32bit integers in c++如何在 C++ 中生成随机 32 位整数
【发布时间】:2014-04-04 04:05:35
【问题描述】:

我的理解是 RAND_MAX 取决于机器的架构。如果机器是 32 位的,那么 rand() 只会生成最多 4 字节的东西。如何在 64 位机器上使用 rand() 生成 32 位随机整数?

另外,如果我以后想用 rand() 生成数十亿个随机整数,是否总是需要 srand()?

【问题讨论】:

  • 把它扔掉...(uint32)rand()
  • 使用 c++11 有一个完整的 标头,里面装满了好东西:en.cppreference.com/w/cpp/header/random
  • 您可能只需调用 rand 两次,然后将结果组合成一个 32 位 int,例如:(rand() ^ (rand()
  • RAND_MAX 取决于 库实现,而不是机器架构,唯一的保证是它至少为 32767。据我所知,在 GNU 库中它是 2147483647在 Visual C++ 中是 32767。我强烈建议您查看 C++11 <random> 库而不是 rand()
  • 和 0xFFFFFFFF 的 64 位 rand 绝对是个好主意。如果我不知道操作系统是否是 32 中的 64 并且仍想生成具有 N 字节长度(N

标签: c++ random


【解决方案1】:

强烈建议不要将 rand() 与位黑客一起使用,因为它在许多情况下可能会导致随机性问题。

c++11 <random> 标头定义了生成任何类型的高质量随机数所需的所有工具,包括任意长度的整数、浮点等...

我建议看这个:https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

【讨论】:

    【解决方案2】:

    由于您已经在使用 rand(),您可能不必担心句点,因此您可以只屏蔽高位。

    一般来说,您应该在程序顶部执行一次类似srand(time(NULL)) 的操作。否则,每次运行程序时,都会生成相同的十亿随机数序列。

    【讨论】:

    • RAND_MAX 可能低于您的预期。它与 MAX_INT 不同。您说“屏蔽高位”,但它们可能全为零。如果您确实需要 32 位随机性,这是一个糟糕的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多