蒙特卡洛思想
七选五全错的概率
英语七选五,选择时不包括重复选项,任意选,全错的概率。
import numpy as np
import time
selection = [1,2,3,4,5,6,7]
cnt = 0 #猜对次数
batch = 1e5 # 测试总次数
start = time.time()
for i in range(int(batch)):
# 生成标准答案
tmp = selection[:]
for j in range(2):
num = np.random.randint(len(tmp))
tmp.remove(tmp[num])
np.random.shuffle(tmp)
#随机猜一个答案
test = selection[:]
for j in range(2):
num = np.random.randint(len(test))
test.remove(test[num])
np.random.shuffle(test)
tmp = np.array(tmp)
test = np.array(test)
ans = tmp-test
# 全部答案错误
if 0 not in ans:
cnt+=1
end = time.time()
print("试验:",cnt,"/",batch,"=",cnt/batch)
print("理论值:",607/1260)
print("time:",end-start)
骰子问题
每个骰子完全一样,每个面完全均匀,上面有1-6,现在第一次任意掷m个骰子,第二次任意掷n个骰子,问第一次所有骰子点数之和大于第二次的概率?
情况很复杂,就对m,n赋值来计算。
import random as r
def rand():
return r.randint(1,6)
def mcrol(a,b):
ret1 = 0
ret2 = 0
for i in range(1000000):
sum1 = 0
sum2 = 0
for j in range(a):
sum1 = sum1 + rand()
for k in range(b):
sum2 = sum2 + rand()
if sum1 > sum2:
ret1 = ret1 + 1
else:
ret2 = ret2 + 1
print(ret1)
print(ret2)
print(ret1/(ret1+ret2))
print()
'''
mcrol(2,1) #0.838261
mcrol(8,4) #0.98948
mcrol(7,8) #0.27502
mcrol(8,6) #0.844521
mcrol(6,4) #0.88397
mcrol(2,2) #0.44
mcrol(3,3) #0.45
mcrol(4,4) #0.45
mcrol(8,8) #0.47
mcrol(3,2) #0.77
'''
硬币问题
现甲乙两人博弈,一枚完全均匀的硬币,投掷很多次,直到分出胜负。
甲胜的条件:硬币连续出现,正,反,反。
乙胜的条件:硬币连续出现,反,反,正。
证明:甲胜的概率是乙的三倍。
import random
count1 = 0
count2 = 0
eig_1 = [1,0,0] #正反反
eig_2 = [0,0,1] #反反正
for i in range(1000000):
compare = []
while True:
x = random.randint(0,1)
compare += [x]
if len(compare)<3:
continue
if compare[-3:] == eig_1:
count1 += 1
break
if compare[-3:] == eig_2:
count2 += 1
break
print(count1)
print(count2)