2017-07-19 24 views
0

我有一個隨機生成的0和1的列表。我需要選擇一個位,並將其翻轉到相反位置:從零到一個或從零到一個零。 位運算符not運算符只能用於整數和長整數,而異或(^)運算符使用兩個整數。在零和列表中翻轉一下

Enter a population size: 4 
Enter an organism length: 2 
[[1, 1], [0, 1], [0, 0], [0, 0]] 
[[[1, 1], [0, 1]]] 

上面的代碼是用戶輸入彈出窗口大小和長度的簡短用戶輸入程序的一部分。該程序打印一個隨機生成的數字列表,用頭腦彈出大小和長度,並將前50%作爲第二個打印列表。現在我需要從第二個列表中選擇一個隨機位並將其翻轉爲零或一個。但是,不是整個列表。

鏈接和解釋非常感謝,我期待着改進。

+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]] 

所以它翻轉了第二位。但它也可能是第一個。通過使用len(individual)我們保證,如果個人的位數增加,它仍然可以工作。

被稱爲在列表中編碼位爲0-1s,是不是很有效。您可以在Python中使用int作爲位列表(int s在中具有任意長度)。

編輯

如果你想翻轉位個人(每一個人也可以是一個不同位),你可以使用一個for循環:

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

如果我按照給定的初始人羣進行分析,我會得到:

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

所以每個人都有一個位翻轉,而不是全部相同。當然這是隨機的,所以有可能在一定的運行中,隨機數發生器會爲每個人選擇相同的位。

+0

如果我想爲每個有機體翻轉一下,我怎麼能這樣做? – tony

+0

@tony:同一位,或每次隨機? –

+0

每次隨機位 – tony

1

要翻轉一個位,請使用邏輯參數。

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

如果翻轉在每個人口只有一個位,我建議:

chrom = random.choice(pop) 
j = random.randrange(len(chrom)) 
chrom[j] = int(not chrom[j])