我们想要从区间[0,1]生成一个统一的随机数
让我们首先生成k个随机布尔值(例如通过rand()< 0.5)并根据这些子区间[m * 2 ^ { - k},(m + 1)* 2 ^ { - k}]的数量来决定会摔倒。然后我们使用一个rand()来获得最终输出m * 2 ^ { - k} + rand()* 2 ^ { - k}。
我们假设我们有任意精度。
以这种方式生成的随机数是否比通常的rand()更“随机”?
PS。我想子区间选择只相当于选择输出0的二进制表示.b_1 b_2 b_3 ...一次一个数字b_i,最后一步是将rand()的表示添加到输出的末尾。
答案 0 :(得分:2)
这可能会有所帮助,但前提是您为第一位和最后一位使用不同的伪随机生成器。 (它不必是一个不同的伪随机算法,只是一个不同的种子。)
如果你使用相同的生成器,那么你仍然只能构造2 ^ n个不同的shuffle,其中n是随机生成器状态中的位数。
如果你有两个生成器,每个生成器有n位状态,那么你最多可以生成2 ^(2n)个不同的shuffle。
答案 1 :(得分:2)
使用随机数生成器进行修改,正如您通过仅使用一位随机空间然后迭代调用一样,通常会削弱其随机属性。所有RNG都无法对随机性进行一些统计测试,但如果您开始进行多次调用并将它们组合起来,您更有可能发现明显的周期出现。
答案 2 :(得分:2)
这取决于"更随机的定义"。如果使用更多随机生成器,则意味着更多随机状态,这意味着循环长度将更长。但循环长度只是随机生成器的一个属性。循环长度为2 ^ 64通常可以用于几乎任何目的(我知道的唯一例外是,如果你需要很多不同的长序列,比如用于某种模拟)。
但是,如果你将两个糟糕的随机生成器组合在一起,它们不一定会变得更好,你必须分析它。但是有一些发电机可以这样工作。例如,KISS就是一个例子:它结合了3个不太好的生成器,结果是一个很好的生成器。
对于卡片改组,您需要加密RNG。即使是非常好的,但不是加密的RNG也不足以达到此目的。例如,Mersenne Twister,这是一个很好的RNG,不适合安全的卡洗牌!这是因为观察输出数字,可以找出其内部状态,因此可以预测随机结果。