Random 使用偏置比特源生成均匀随机比特

Random 使用偏置比特源生成均匀随机比特,random,probability,Random,Probability,我们有一个有偏随机位的源,即概率p产生0的源,或者概率1-p产生1的源 我们如何使用这个来源来构建一个生成概率相等的0或1的生成器?一种方法是调用有偏生成器N次,将结果相加,然后如果总和小于总和的中值,则将无偏样本取为0,否则取1。唯一的诀窍是知道如何选择N以及中位数是什么。最后,他们讨论了如何找到中间值。(注意,反过来是p,在文章中是1的概率)你掷两次有偏差的硬币。有四种可能的结果: 01-选择数字0作为返回值 10-选择数字1作为返回值 00-再次开始投掷两枚硬币 11-再次开始投掷两枚硬

我们有一个有偏随机位的源,即概率
p
产生0的源,或者概率
1-p
产生1的源


我们如何使用这个来源来构建一个生成概率相等的0或1的生成器?

一种方法是调用有偏生成器N次,将结果相加,然后如果总和小于总和的中值,则将无偏样本取为0,否则取1。唯一的诀窍是知道如何选择N以及中位数是什么。最后,他们讨论了如何找到中间值。(注意,反过来是p,在文章中是1的概率)

你掷两次有偏差的硬币。有四种可能的结果:

  • 01
    -选择数字
    0
    作为返回值
  • 10
    -选择数字
    1
    作为返回值
  • 00
    -再次开始投掷两枚硬币
  • 11
    -再次开始投掷两枚硬币

当您计算得到
01
10
的概率时,您将看到它是相同的。这样序列
01
10
以相同的概率出现,而不管值
p

那么,有一种称为熵提取器的方法,它允许从不太随机的源中获取(好的)随机数

如果您有三个独立但质量稍低(有偏差)的RNG,则可以将它们组合成统一的源

假设您有三个生成器,每个生成器给您一个字节,那么统一的输出将是

t=X*Y+Z

其中,在GF(28)有限域上进行加法和乘法

代码,Python

import numpy as np
import matplotlib.pyplot as plt
from pyfinite import ffield

def RNG(p):
    return np.random.binomial(1, p) + \
           np.random.binomial(1, p)*2 + \
           np.random.binomial(1, p)*4 + \
           np.random.binomial(1, p)*8 + \
           np.random.binomial(1, p)*16 + \
           np.random.binomial(1, p)*32 + \
           np.random.binomial(1, p)*64  + \
           np.random.binomial(1, p)*128

def muRNG(p):
    X = RNG(p)
    Y = RNG(p)
    Z = RNG(p)

    GF = ffield.FField(8)
    return GF.Add(GF.Multiply(X, Y), Z)

N = 100000
hist = np.zeros(256, dtype=np.int32)
for k in range(0, N):
    q = muRNG(0.7)
    hist[q] += 1

x = np.arange(0, 256, dtype=np.int32)

fig, ax = plt.subplots()
ax.stem(x, hist, markerfmt=' ')
plt.show()
将生成字节分布图-对于[0…256]中的值,看起来相当统一。我可以找到提出此想法的论文

只是为了举例说明,当我们收集字节而不提取熵时,代码是这样的

...
q = RNG(0.7) # just byte value from bits with p=0.7
...
与图形


很好,但是很多浪费
p
的价值是已知的吗?@PeterO,不是known@PeterO是的,这就是我想要的和Progman说的。我没有发现这个讨论——我的错。