小白鼠試毒模擬
阿新 • • 發佈:2018-12-10
"""
1000 個瓶子,其中一瓶是毒藥其餘為水,小白鼠飲用毒藥後會在第二天死亡
最少需要多少隻小白鼠才可以在第二天知道那瓶是毒藥?
採用點陣圖 + 位運算的方式進行狀態判斷,複雜度 O(log2 N )
"""
import random
bottles = {x: 0 for x in range(1000)}
poison = random.randint(0, 999)
bottles[poison] = 1
print("隨機生產的一瓶毒藥:{}".format(poison))
mice = [1 << x for x in range(10)]
result = []
for m in mice:
r = 0 # 0 活著, 1死了
choose = filter(lambda x: x & m, bottles.keys()) # 選擇小白鼠去試毒的瓶子
for bottle in choose:
r |= bottles[bottle] # 試毒過程
if r: # 死了,換下一隻接著試
break
result.append(r)
# 二進位制轉十進位制
temp = '0b' + ''.join(str(i) for i in result[::-1])
print("計算出第{}瓶為毒藥" .format(int(temp, 2)))