std :: random_shuffle是多么随机?

Ale*_*lds 1 c++ random stl

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

我们假设:

  • 我想样品长度的十进制数(底为10)ceil(log10(MY_CUSTOM_RAND_MAX))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_shuffleshuffle向量,我可以从末尾迭代每个元素,乘以10的递增幂将其转换为unsigned long long或映射到我的最终范围的任何内容.

我不知道它是否有任何std::random_shuffle随机性存在问题,特别是在选择一系列rand()结果来填充时vector<char>.

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

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

Joh*_*mew 7

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

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