假如有9张扣着的牌,其中7张普通牌各自翻出猫的概率相同,比如5%能翻出来( 95%翻出来不是猫),一 张简单牌,翻出来猫的概率是20%,一张困难牌,翻出来猫的概率是1%。我现在有三轮翻牌机会,每轮都可以把所有牌翻开,全都翻开后为一轮结束,每轮结束后除了翻出来猫的牌其余全都扣回去,猫牌就留在原地不动,之后猫牌不再参与翻牌,然后进行下一轮翻牌。要是翻出来猫的话,不管几个,翻牌机会可以重置为3轮。当翻牌机会用完或者所有牌都翻出来猫游戏结束。
举个例子,比如9张牌编号1-9,1-7为普通,8为简单,9为困难, 我第一轮翻完时,8翻出了猫,这时我剩下的机会不是2轮而是重置为了3轮,下轮我只需要翻17和9, 8已经是猫就不用再翻了。然后接下来三轮每轮我都没翻出来猫,机会耗尽,所以这次游戏结束结果统计为1。
import random as ra
def generate(normal, simple, hard):
is_cat_normal = [0]
is_cat_simple = [0]
is_cat_hart = [0]
for i in range(normal):
is_cat = ra.random() * 100
if is_cat < 5:
is_cat_normal.append(1)
else:
is_cat_normal.append(0)
for i in range(simple):
is_cat = ra.random() * 100
if is_cat < 20:
is_cat_simple.append(1)
else:
is_cat_simple.append(0)
for i in range(hard):
is_cat = ra.random() * 100
if is_cat < 1:
is_cat_hart.append(1)
else:
is_cat_hart.append(0)
return is_cat_normal, is_cat_simple, is_cat_hart
def game():
sum_ = 0
count = 3
normal, simple, hard = 7, 1, 1
while count > 0 & sum_ < 9:
count -= 1
cat1, cat2, cat3 = generate(normal, simple, hard)
has_cat1 = sum(cat1)
has_cat2 = sum(cat2)
has_cat3 = sum(cat3)
sum_ += has_cat1 + has_cat2 + has_cat3
if has_cat1 != 0 or has_cat2 != 0 or has_cat3 != 0:
count = 3
normal -= has_cat1
simple -= has_cat2
hard -= has_cat3
return sum_
if __name__ == '__main__':
time = 10000 * 50
result = dict()
for i in range(10):
result[i] = 0
for i in range(time):
res = game()
result[res] += 1
print(result)
for i in range(10):
result[i] = "{0:.10f}".format(result[i] / time)
print(result)
模拟 50万次结果
{0: 84903, 1: 80804, 2: 90632, 3: 85654, 4: 68857, 5: 47392, 6: 26958, 7: 11358, 8: 3073, 9: 369}
{0: '0.1698060000', 1: '0.1616080000', 2: '0.1812640000', 3: '0.1713080000', 4: '0.1377140000', 5: '0.0947840000', 6: '0.0539160000', 7: '0.0227160000', 8: '0.0061460000', 9: '0.0007380000'}