【问题标题】:What's a simple way to generate a random bool in C? [duplicate]在 C 中生成随机布尔值的简单方法是什么? [复制]
【发布时间】:2016-01-08 17:42:42
【问题描述】:

我想生成一个用于游戏的随机布尔值,因此它不需要加密安全。我将在我的代码中使用stdbool.h,并且我也使用了#include <stdlib.h>。最好,它应该非常快(因为我将生成其中的许多),并且应该能够在 C89 中完成(只是偏好)。我对用 C++ 做这件事一点兴趣都没有。

以下是我想出的一些方法:

  • 从 /dev/urandom 读取,过滤掉单个数字,>5 = true,
  • 继续调用 rand() 并过滤掉低/高值。

【问题讨论】:

  • 如果你调用rand,你可以对结果执行% 2得到一个0或1。
  • > 5 = true, < 5 = false 意味着大多数时候你会得到 true,除非你从 /dev/urandom 流中只提取 3 位,那么你会得到 false 大多数时间

标签: c random


【解决方案1】:

如果您在 x86_64 CPU 上有 RDRAND 指令集:

#include <immintrin.h>
#include <cstdint>
...
bool randBool() {
  uint64_t val;
  if(!_rdseed64_step(&val)) {
    printf("Error generating hardware random value\n");
  }
  return bool(val&1);
}

但是,这会浪费生成的 64 个伪随机位中的 63 个。如果您需要更快的速度,请在 64 个随机位生成中调用一次 _rdseed64_step(),但更改每一代中测试的位:val&amp;(1&lt;&lt;0)、val &amp; (1&lt;&lt;1)、val &amp; (1&lt;&lt;2)、val &amp; (1&lt;&lt;3)、...、val &amp; (1&lt;&lt;i)、 ..., val &amp; (1&lt;&lt;63) .

【讨论】:

    【解决方案2】:

    只需调用rand() 并获取其返回值的LSB。

    bool randbool = rand() & 1;
    

    记得在开头拨打srand()。

    【讨论】:

    • 结果相同,但% 2 可能更清晰一些(即自我记录)。
    • 我认为&amp; 1 可能会生成更高效的代码(未优化时)
    • 一个好的优化编译器将生成最高效的代码,无论您使用哪一个。为了可读性和清晰度而进行编程比尝试手动优化更好。
    • 这是一种反模式,因为 rand 生成的低位可能不是很随机。最好与RAND_MAX/2 进行比较。 (请参阅手册页中的注释部分man7.org/linux/man-pages/man3/rand.3.html)
    • 这是一个非常糟糕的做法。 rand() 的实现依赖于线性同余生成器 (LCG),这是出了名的有问题的伪随机数生成器。它们在输出的较低位缺乏随机性。您至少应该采取最重要的部分。
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2014-12-20
    • 2013-10-12
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多