J'étais accro au blackjack d'Asobi J'ai essayé d'obtenir la distribution des valeurs totales des parents dans un histogramme.
À ce moment-là, je suis tombé sur le processus de A, Je l'ai traité comme suit.
Au lieu de traiter A comme de base 11, Définissez le paramètre "grace". Lorsque A est soustrait, le paramètre est incrémenté de 1. Si le paramètre est égal ou supérieur à 1 lorsqu'il dépasse 21 Réduisez 10 du total et retournez
Considérons d'abord le cas de traiter A comme un seul.
Installez d'abord le module
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as random
import pandas as pd
%matplotlib inline
Offre de fonction de dessin de carte Une fonction qui tire des cartes et renvoie le résultat jusqu'à ce que le total atteigne 17. Croupier Normal_deck représentant un tas de cartes
def deal(x,deck):
x += random.choice(deck)
return x
def dealer(x,deck):
while x < 17 :
x = deal(x,deck)
return x
normal_deck = [1,2,3,4,5,6,7,8,9,10,10,10,10]*4
Maintenant chez le concessionnaire (total des parents, carte à utiliser) Vous obtiendrez la valeur totale de la carte parent finale. Essayons de le tourner environ 100 000 fois et d'afficher les données dans un histogramme. Voici un exemple de tirage d'une carte dans un état où la valeur totale des parents est de 10.
ln =[]
for i in range(100000):
ln.append(dealer(10,normal_deck))
bins= [17,18,19,20,21,22,23,24,25,26,27]
plt.hist(ln, bins=bins)
résultat
L'axe vertical peut être une fréquence relative ou différente.
Quand A sort, il est calculé comme 11. Cependant, lorsqu'il dépasse 21, --Si A apparaît, faites -10 et continuez le calcul. --Si A n'est pas affiché, le calcul s'arrête
Si c'est le cas, cela s'est bien passé.
J'écrirai une fonction.
def deal_(deck):
x = random.choice(deck)
return x
L'accord précédent a renvoyé la valeur totale, Cette fois, la valeur de la carte tirée est retournée telle quelle.
def dealer2(x,deck):
#Partie de réglage
if x == 1:
para = 1 #Réglage de grâce
x = 11
else:
para = 0
#Fin de la partie réglage
while x < 17 : #---------------------------
# hit card part
y = deal_(deck)
#print(y)
if y != 1: # not hit A case
if x + y <=21:
x += y
elif para >= 1:
para += -1
x += y - 10 # x+Soustraire 10 de y
else:
x += y
else: # hit A case
para += 1
if x <= 10:
x +=11
elif para >=1:
para += -1
x += 1
else:
print('error')
x += 1
#--------------------------------------------------
return x
Traiter 1 comme élémentaire 11 Si la carte supérieure (carte visible à l'avance) est 1, Réglez la valeur totale sur 11 et le paramètre (para) sur 1. Réglez le paramètre (para) sur 0 même si la carte upcard n'est pas 1.
Changez selon que la carte tirée est 1 (signifiant A).
--Si le nombre de cartes tirées est de 1, Ajoutez 1 à para et ajoutez 11 à la valeur.
--Si la carte tirée est différente de 1, Fondamentalement le même que la version précédente.
Dans les deux cas, demandez une action de grâce au cas où vous dépassez 21.
Si para vaut 1 ou plus, c'est-à-dire si A n'est pas encore utilisé comme 1 Convertissez A utilisé comme 11 en 1, c'est-à-dire que la valeur totale est -10.
S'il n'y a pas de A, ou si tous sont convertis en 1, para vaut 0, donc La valeur totale est renvoyée telle quelle.
Écrivons un histogramme en utilisant une nouvelle fonction. Voici un exemple de démarrage avec une valeur parent totale de 13.
ln = []
bins = [17,18,19,20,21,22,23,24,25,26,27]
for i in range(100000):
ln.append(dealer2(13, normal_deck))
plt.hist(ln, normed=True, bins=bins, align='left', rwidth=0.9)
Valeur de retour
array([0.09648, 0.09533, 0.0955 , 0.09558, 0.09561, 0.09664, 0.3286 ,
0.03688, 0.0326 , 0.02678]),
array([17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]),
<a list of 10 Patch objects>)
Je veux connaître chaque valeur, je vais donc retirer les données de l'histogramme. Ce code renvoie un histogramme avec une valeur totale initiale de x et n essais.
def check(x,n):
ln = []
bins = [17,18,19,20,21,22,23,24,25,26,27]
for i in range(n):
ln.append(dealer2(x, normal_deck))
data = plt.hist(ln, normed=True, bins=bins, align='left', rwidth=0.9, cumulative=False)
sum = 0
for i in range(0,5):
sum += data[0][i]
print('La probabilité de ne pas éclater{:.2f} %'.format(sum*100))
for i in range(0,10):
print('{}La probabilité de devenir{:.2f} %'.format(data[1][i],data[0][i]*100))
check(2,10000)
Valeur de retour
La probabilité de ne pas éclater est de 64.64 %
La probabilité de devenir 17 est de 13.44 %
La probabilité de devenir 18 est de 13.28 %
La probabilité de devenir 19 est de 13.03 %
La probabilité de devenir 20 est de 12.86 %
La probabilité de devenir 21 est de 12.03 %
La probabilité de devenir 22 est de 15.13 %
La probabilité de devenir 23 est de 6.38 %
La probabilité de devenir 24 est de 5.50 %
La probabilité de devenir 25 est de 4.57 %
La probabilité de devenir 26 est de 3.78 %
C'est tout
Si vous souhaitez définir si A est inclus dans l'état initial du parent, vous pouvez le faire, Je l'ai omis parce que cela semble irréalisable.
Chaque fois que je pioche une carte, ou si elle sort déjà Je veux également empêcher cette carte d'apparaître.
Recommended Posts