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

の 2 番目の引数はrandom.shuffle、float ではなく callable にする必要があります。試す:

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 より小さい最大の float に置き換える必要があります。

于 2012-12-04T15:19:54.413 に答える