【问题标题】:Transformation of distorted random sequences produces random sequences?扭曲随机序列的变换产生随机序列?
【发布时间】:2015-03-29 07:22:39
【问题描述】:

我的程序生成了可以称为 switch(x) 的序列。

下面是生成它们的算法的描述:

# define a switch(x) sequence of length n^2
def switch(x):
    s = []                                     # define a bit string s:
    s.append(random.choice([True, False]))     # set its first bit randomly,
    for i in range(1, n * n):                  # but for every subsequent bit i,
        prior = s[i-1]                         # find its prior bit i-1,
        shouldSwitch = x > random.random()     # and with probability 1-x,
        if shouldSwitch: s.append(not prior)   # set i to opposite of its prior;
        else: s.append(prior)                  # otherwise, have i = its prior.
    return s

在 x = .5 时,该序列被认为是完全随机的位序列。偏离 x 通过产生过于频繁地交替或重复位的序列来扭曲这种随机性。

我编写了一个程序,计算生成的 switch(x) 序列的平均交替率。

r = 0.0
for i in range(len(s)-1):
    if s[i] != s[i+1]:
        r = r + 1
rate = r/(len(s)-1)

当然,当我通过 switch(x) 序列时,无论 x 是什么,我总是获得一个相对接近 x 的速率。比如,在 1/100 以内。

但假设我像这样转换生成的 switch(x) 序列(其中 len(s) = n*n):

s1 = switch(x)
s2 = []
for i in range(n):
    for j in range(n):
        s2.append(s1[i + j*n])

每当我计算以这种方式转换的序列的交替率时,我总是得到一个非常接近 0.5 的值!一致性是可怕的。

这对我来说没有多大意义,尤其是对于非常接近 0 或 1 的 x 值。所以我希望你能帮助我找出问题所在。

抱歉,如果我的风格/效率有问题。

【问题讨论】:

    标签: python algorithm random


    【解决方案1】:

    如果单次翻转的概率是 x,并且我们考虑比较序列中相隔 2 步的值,我们有(其中 F 是翻转,N 没有翻转):

    P(FF) = x*x
    P(NN) = (1-x)*(1-x)
    P(FN) = x*(1-x)
    P(NF) = (1-x)*x
    

    在前两种情况下,这两个值将相等,而在后两种情况下,它们将不同。所以,

    P(equal) = P(FF) + P(NN) = x*x + (1-x)*(1-x)
    P(different) = P(FN) + P(NF) = x*(1-x) + (1-x)*x = 2x*(1-x)
    

    所以对于一个值x = 0.25 来说,我们有

    P(equal) = 0.25*0.25 + 0.75*0.75 = 0.625
    P(different) = 2 * 0.25 * 0.75 = 0.375
    

    与我们开始使用的 x 相比,它更接近 0.5。我怀疑如果值相差超过 2,这将开始接近 0.5,如您所见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2018-06-05
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多