我想在 C++ 中生成一个任意长度的随机数。 “合理任意”是指受主机速度和内存限制。
假设:
我想采样一个长度为
ceil(log10(MY_CUSTOM_RAND_MAX))
的十进制数(以 10 为底)来自0
至10^(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/