如何使用高斯分布对列表进行洗牌

3

我想在一条消息中模拟故障(例如:1000010011 => 1010000011)。有没有办法在Python中实现这个功能?我尝试了以下代码,可以达到效果:

import random
a = "1011101101"
b = [el for el in a] # b = ['1', '0', '1', '1', '1', '0', '1', '1', '0', '1']
random.shuffle(b)
print b # b = ['0', '1', '1', '1', '0', '1', '1', '1', '1', '0']
random.shuffle(b, random.random)
print b # b = ['1', '1', '0', '1', '1', '0', '1', '0', '1', '1']

我希望我的重新排序是正态/高斯分布的。 例如:

import random
a = "1011101101"
b = [el for el in a] # b = ['1', '0', '1', '1', '1', '0', '1', '1', '0', '1']
random.shuffle(b,random.gauss(0.5,0.1))
print b # b = ['1', '0', '1', '1', '0', '0', '1', '1', '1', '1'] <= assume this is Gaussian distributed...
# OR
c = random.gauss(0.5,0.1)
random.shuffle(b,c)
print b # b = ['0', '0', '1', '1', '1', '0', '1', '1', '1', '1'] <= assume this is also Gaussian distributed...

然而,这并不起作用,我收到了以下消息:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\random.py", line 287, in shuffle
    j = int(random() * (i+1))
TypeError: 'float' object is not callable

任何建议/评论都将不胜感激。
谢谢。
注意:我只要求重新排列错误(例如:1000010011 => 1010000011)。但是,我还计划模拟突发错误(例如:1000010011 => 1011111011),单个事件(例如:1000010011 => 1000010011)等。
其他相关问题:Python: binary string error simulation

1
你可以用简单的 b = list(a) 替换掉列表推导式中的 b - yurisich
2个回答

5
c = lambda: random.gauss(0.5,0.1)

4
random.shuffle的第二个参数应该是可调用对象,而不是浮点数。尝试使用以下代码:
random.shuffle(b, lambda:random.gauss(0.5,0.1))

要将区间从0到1限制在一定范围内,您可以使用:
random.shuffle(b, lambda: max(0.0, min(1.0, random.gauss(0.5,0.1))))

(感谢 @DSM)

如果您很注重细节,上述的限制实际上包括1.0,这将导致random.shuffle出现错误。实际上,您应该将1.0替换为小于1.0的最大浮点数。


1
请注意根据参数可能需要限制随机结果,以确保它们位于 [0.0, 1.0) - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接