import random
from concurrent.futures import ThreadPoolExecutor
# import matplotlib.pyplot as plt
player_amount = 100
epochs = 10
conse_thresh = 4
money = 1023
strt_bet = 1
A = 1
J = 20
Q = 30
K = 40
pokers = []
for i in range(4*8):
for poker in [A,2,3,4,5,6,7,8,9,10,J,Q,K]:
pokers.append((i+1)*100+poker)
def pick_poker(remain_pokers):
if len(remain_pokers)==0:
remain_pokers = pokers.copy()
random.shuffle(remain_pokers)
card = random.choice(remain_pokers)
remain_pokers.remove(card)
return card%10
def one_game(remain_pokers):
card1 = pick_poker(remain_pokers)
card2 = pick_poker(remain_pokers)
card3 = pick_poker(remain_pokers)
card4 = pick_poker(remain_pokers)
player = (card1 + card3)%10
banker = (card2 + card4)%10
if player in [8,9] or banker in [8,9]:#天牌情况
pass
elif player in [6,7]:
if banker in [0,1,2,3,4,5]:
card5 = pick_poker(remain_pokers)
banker = (banker + card5)%10
elif player in [0,1,2,3,4,5]: #闲补牌(0~6)
card5 = pick_poker(remain_pokers)
player = (player + card5)%10
case1 = banker in [0,1,2]
case2 = banker in [3] and card5 not in [8]
case3 = banker in [4] and card5 not in [0,1,8,9]
case4 = banker in [5] and card5 not in [0,1,2,3,8,9]
case5 = banker in [6] and card5 not in [0,1,2,3,4,5,8,9]
if case1 or case2 or case3 or case4 or case5:
card6 = pick_poker(remain_pokers)
banker = (banker + card6)%10
if player > banker:
return 0
elif player < banker:
return 1
else:
return 2
def one_player(money,strt_bet):
remain_pokers = []
rest_money = []
cur_bet = strt_bet
cur_money = money
conse_time = 0
last_res = -1
for _ in range(10000):
if cur_money == 0:
return rest_money[-1]
cur_bet1 = min(cur_bet1,cur_money)
res = one_game(remain_pokers)
if conse_time >= conse_thresh:
if last_res == 1 and res == 0:#win
cur_money += cur_bet
cur_bet1 = strt_bet
elif last_res == 0 and res == 1:#win
cur_money += cur_bet*0.95
cur_bet1 = strt_bet
elif last_res == 2:
pass
else:
cur_money -= cur_bet
cur_bet1 *= 2
if res == last_res:#post_process
conse_time+=1
else:
conse_time=0
last_res=res
rest_money.append(cur_money)
# if cur_money1 > 1033:
# break
return rest_money[-1]
def one_epoch(player_amount):
cnt = 0
sum = 0
# for _ in range(player_amount):
# rest_money = one_player(money,strt_bet)
# res = rest_money
# if res == 0:
# cnt += 1
# print(f"{(cnt/(_+1)):.6f}: {res:.2f}")
with ThreadPoolExecutor() as executor:
futures = [executor.submit(one_player, money, strt_bet) for _ in range(player_amount)]
for future in futures:
rest_money = future.result()
res = rest_money
if res == 0:
cnt += 1
sum += 1
print(f"{(cnt/sum):.6f}: {res:.2f}")
# fig, ax = plt.subplots()
# # 绘制折线图
# ax.plot(rest_money)
# # 保存图像为 PNG 文件
# plt.savefig(f'line_plot_{_}.png')
for _ in range(epochs):
one_epoch(player_amount)