std :: random_shuffle是多么随机?

时间:2010-12-29 10:16:19

标签: c++ stl random

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

我们假设:

  • 我想从ceil(log10(MY_CUSTOM_RAND_MAX))0

  • 对长度为10^(ceil(log10(MY_CUSTOM_RAND_MAX))+1)-1的十进制数(基数10)进行采样
  • 我有vector<char>

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

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

如果我使用std::random_shuffle来移动矢量,我可以从末尾迭代每个元素,乘以10的递增幂将其转换为unsigned long long或者映射到我的最终范围的任何内容

我不知道std::random_shuffle在随机性方面是否存在问题,尤其是在选择一系列rand()结果来填充{{1}时}。

vector<char>以可量化的方式以这种方式生成任意长度的随机数是多么粗略?

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

1 个答案:

答案 0 :(得分:7)

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

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