失真随机序列的变换会产生随机序列吗?

时间:2015-01-29 21:54:20

标签: python algorithm random

我的程序会生成所谓的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通过产生交替或重复位的序列来扭曲这种随机性。

我制作了一个计算生成的开关(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)

当然,当我通过它放置一个开关(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])

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

这对我来说没有多大意义,特别是对于非常接近0或1的x的值。所以我希望你能帮助我弄清楚出了什么问题。

如果对我的风格/效率感到不满,我很抱歉。

1 个答案:

答案 0 :(得分:0)

如果单次翻转的概率为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

与我们开始的0.5相比更接近x。我怀疑,当价值进一步分开然后是2时,你会看到这将开始接近0.5。