c++ - std::random_shuffle 到底有多随机?

标签 c++ stl random

我想在 C++ 中生成一个任意长度的随机数。 “合理任意”是指受主机速度和内存限制。

假设:

  • 我想采样一个长度为 ceil(log10(MY_CUSTOM_RAND_MAX)) 的十进制数(以 10 为底)来自 010^(ceil(log10(MY_CUSTOM_RAND_MAX))+1)-1

  • 我有一个 vector<char>

  • vector<char>的长度是ceil(log10(MY_CUSTOM_RAND_MAX))

  • 每个 char实际上是一个整数,一个介于 0 和 9 之间的随机数,用 rand() 选取或类似的方法

如果我使用 std::random_shuffle为了打乱 vector ,我可以从末尾开始遍历每个元素,乘以十的增量幂将其转换为 unsigned long long或者任何映射到我的最终范围的东西。

不知道std::random_shuffle有没有问题就随机性而言,特别是在选择 rand() 的序列时结果填充 vector<char> .

std::random_shuffle 有多粗略?在可量化的意义上以这种方式生成任意长度的随机数?

(我意识到 Boost 中有一个用于生成随机 int 数字的库。目前尚不清楚范围限制是什么,但它看起来像 MAX_INT 。也就是说,我意识到该库存在。这是更多关于生成任意大随机数的 STL 这部分的一般性问题。预先感谢您将您的答案集中在这部分。)

最佳答案

我不太清楚这个问题的重点,但我会尝试从几个不同的角度来回答:

  • 标准库 rand() 函数的质量通常很差。但是,很容易找到质量更高的替代随机数生成器(您自己提到了 Boost.Random,很明显您知道其他 RNG)。也可以通过组合多次调用的结果来提高(没有双关语意) rand() 输出的质量,只要你小心:http://www.azillionmonkeys.com/qed/random.html
  • 如果您最终不想要十进制表示形式,那么生成它然后再转换为二进制几乎没有意义。您可以轻松地将多个 32 位随机数(来自 rand() 或其他地方)组合在一起以生成任意位宽的随机数。
  • 如果您随机生成单个数字(二进制​​或十进制),则之后将它们打乱几乎没有意义。

关于c++ - std::random_shuffle 到底有多随机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553223/

相关文章:

c++ - 共享库中的类和静态变量

perl - 如何从 Perl 中的数组中获取加权随机选择?

c++ - rand() 有时会连续返回相同的结果吗?

r - R : How to set fpc argument (finite population correction) 中的调查包

c++ - 通过引用将参数传递给 std::async 失败

c++ - 在 cout 语句中连接数组大小

c++ - 如何在 Windows 上构建 SHHTTPD?

c++ - 为什么需要配对才能插入 map ?

c++ - 不能 push_back 包含指向 vector 的 ofstream 指针的类

c++ - 一组具有不同 == 和 < 运算符语义的结构