【问题标题】:How to shuffle a list with Gaussian distribution如何使用高斯分布对列表进行洗牌
【发布时间】:2012-11-22 06:19:06
【问题描述】:

我想模拟一条消息的故障(例如: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

【问题讨论】:

  • 您可以将b 的列表理解替换为简单的b = list(a)

标签: python random simulator fault gaussian


【解决方案1】:
c = lambda: random.gauss(0.5,0.1)

【讨论】:

    【解决方案2】:

    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 的最大浮点数。

    【讨论】:

    • 请注意,根据参数,可能需要限制随机结果以确保它们位于 [0.0, 1.0) 中。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多