2012-12-04 77 views
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'的列表理解。 – Droogans

回答

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。

+0

非常感謝@silvado –

+1

請注意,根據參數,可能有必要限制隨機結果以確保它們位於'[0.0,1.0]'中。 – DSM

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