增加随机性的算法?

时间:2018-11-16 07:41:47

标签: random

假设我为您提供了0到1之间的随机种子,但是经过一些观察,您发现我的种子分布不正确,其中大多数种子少于0.5 ,您是否仍然可以通过使用使种子更加分散的算法来使用该资源?
如果是,请提供必要的信息。

3 个答案:

答案 0 :(得分:1)

这实际上取决于间隔[0 ... 1]中数字的分配方式。通常,您需要CDF(累积分布函数)将任意的[0 ... 1]域分布映射为统一的[0 ... 1]。但是对于某些特定情况,您可以进行一些简单的转换。下面的代码(在Python中)首先构造了简单的不公平RNG,该RNG会生成低于0.5的数字的60%和高于40%的数字。

import random

def unfairRng():
    q = random.random()
    if q < 0.6: # result is skewed toward [0...0.5] interval
        return 0.5*random.random()

    return 0.5 + 0.5*random.random()

random.seed(312345)

nof_trials = 100000

h = [0, 0]
for k in range(0, nof_trials):
    q = unfairRng()
    h[0 if q < 0.5 else 1] += 1

print(h)

然后我计算出高于和低于0.5的数字,并且我的计算机上的输出是

[60086, 39914]

这与我描述的60/40分割非常接近。

好吧,让我们通过从unfairRNG中获取数字并交替返回值和下次返回1值来“修复” RNG。同样,Python代码

def fairRng():
    if (fairRng.even == 0):
        fairRng.even = 1
        return unfairRng()
    else:
        fairRng.even = 0
        return 1.0 - unfairRng()

fairRng.even = 0

h = [0, 0]
for k in range(0, nof_trials):
    q = fairRng()
    h[0 if q < 0.5 else 1] += 1

print(h)

再次计算直方图,结果为

[49917, 50083]

“修复”不公平的RNG并使其公平。

答案 1 :(得分:0)

将硬币从不公平硬币中翻转出来是通过翻转两次,如果结果不同,则使用第一个。否则,丢弃结果。

这导致硬币的几率恰好为50/50,但不能保证在有限的时间内运行。

答案 2 :(得分:0)

通过任何算法生成的随机数序列将不比种子本身具有更多的熵(“随机性”)。例如,如果每个种子的每64位熵只有1位,则至少在理论上可以将它们转换为具有完全熵的1位随机数。但是,测量这些种子的熵并非易事(熵估计)。此外,并非每种算法都适合所有情况下提取随机种子的熵(熵提取随机性提取)。