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:二进制字符串错误模拟

4

2 回答 2

5
c = lambda: random.gauss(0.5,0.1)
于 2012-12-04T15:20:22.777 回答
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 的最大浮点数。

于 2012-12-04T15:19:54.413 回答