2017-07-19 6 views
0

ランダムに生成された0と1のリストがあります。私は1つのビットを選び、それをその反対に反転する必要があります:0から1または1から0までです。 ビット単位のnot演算子は、整数とlong整数でのみ機能し、xor(^)演算子は2つの整数で動作します。0と1のリストに少しフリップ

上記のコードは、ユーザーがポップサイズと長さを入力する短いユーザー入力プログラムの一部です。プログラムはランダムに生成された数字のリストをポップサイズと長さに気を付けて印刷し、第2の印刷リストである上位50%をとります。今度は、2番目のリストからランダムなビットを選んでゼロまたは1に反転する必要があります。しかし、リスト全体ではありません。

リンクと説明は非常に高く評価されています。私は改善したいと考えています。

+0

あなたは任意のコードを試していないことがありますか? –

答えて

2

あなたはインデックスのランダムな整数を生成するrandintを使用して、同じように、それを反転し、インスタンス^1ために使用することができます。

from random import randint 

pop = [[1, 1], [0, 1], [0, 0], [0, 0]] 
individual = pop[1]       # select the second individual 
individual[randint(0,len(individual)-1)] ^= 1 # flip the bit 

私はこれを実行した後、私が得た:

>>> pop 
[[1, 1], [0, 0], [0, 0], [0, 0]] 

と表示され、2番目のビットが反転しました。しかし、それは最初のことでもありました。 len(individual)を使用することにより、個人のビット数が増えると、それでも機能することが保証されます。

これは、リスト内の0-1のビットを符号化することはあまり効率的ではありません。 Pythonでintをビットのリストとして使用できます(intは任意の長さがにあります)。

for individual in pop:        # iterate over population 
    individual[randint(0,len(individual)-1)] ^= 1 # flip a random bit 

EDIT

あなたが(すべての個人のために、それは異なるビットをすることができます)個々あたりのビットを反転したい場合は、forループを使用することができます私があなたの与えられた最初の人口でこれを動かすと、私は得る:

>>> pop 
[[0, 1], [1, 1], [0, 1], [1, 0]] 

だから、すべての人がちょうど1ビット反転していて、すべて同じものではありません。もちろん、それはランダムであるため、特定の実行では、乱数ジェネレータがすべての個体に対して同じビットを選択する可能性があります。

+0

生物ごとに1ビットずつ反転したいのですが、どうしたらいいですか? – tony

+0

@tony:毎回同じビット、またはランダム? –

+0

ランダムビット毎回 – tony

1

単一ビットを反転するには、論理引数を使用します。

int(not 0) = 1 
int(not 1) = 0 

あなたはすべての住民に正確に1つのビットを反転する必要がある場合は、私がお勧めします:

chrom = random.choice(pop) 
j = random.randrange(len(chrom)) 
chrom[j] = int(not chrom[j]) 
関連する問題