【问题标题】:Generating uniform random bits using a source of biased bits [duplicate]使用偏置位源生成均匀随机位 [重复]
【发布时间】:2020-11-16 07:33:29
【问题描述】:

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

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

【问题讨论】:

  • p 的值是否已知?
  • @PeterO,未知
  • @PeterO,是的,这就是我想要的,也是 Progman 所说的。我没有找到这个讨论 - 我的错。

标签: random probability


【解决方案1】:

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

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

当你计算得到0110 的概率时,你会发现它是一样的。这样,序列0110 出现的概率相同,而与p 的值无关。

【讨论】:

  • 不错,但是浪费很多
【解决方案2】:

一种方法是调用有偏生成器 N 次,对结果求和,然后如果总和小于总和的中位数,则将无偏样本设为 0,否则为 1。唯一的诀窍是知道如何选择 N 以及中位数是多少。在wiki article 中,他们讨论了寻找中位数。 (注意他们有 p 反过来,在文章中它的概率是 1)

【讨论】:

    【解决方案3】:

    嗯,有一种方法,称为熵提取器,它允许从不完全随机的源中获取(好的)随机数。

    如果您有三个独立但质量有些低(有偏差)的 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
    ...
    

    和图表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2018-12-21
      • 2020-09-07
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多