J'ai confirmé avec des lycéens si cela serait rentable avec la méthode du double pari (méthode Martingale) avec Python

introduction

Mon fils, qui aime les mathématiques, semble connaître quelque part la méthode du double pari et l'a expliqué de manière intéressante.

[D'après Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%83%E3%83%86%E3%82%A3%E3] par la méthode martingale % 83% B3% E3% 82% B0% E3% 82% B7% E3% 82% B9% E3% 83% 86% E3% 83% A0)

La méthode la plus classique et la plus connue, qui a longtemps été appréciée comme méthode de gain de casino. Aussi connue sous le nom de méthode de double pari. Premièrement, vous pariez 1 unité, si vous perdez, vous pariez 2 unités, et si vous perdez, vous pariez 4 unités, et si vous gagnez ne serait-ce qu'une fois, vous revenez immédiatement à 1 unité. Quel que soit le nombre d'essais, vous obtiendrez 1 crédit lorsque vous gagnerez. Dans de nombreux cas, vous gagnez un petit montant, mais lorsque vous perdez, vous perdez beaucoup. Si vous perdez continuellement, vous atteindrez bientôt la limite supérieure de paris appelée limite punk ou table.

Je savais que ça ne marcherait pas.

Cependant, je n'avais pas essayé de perdre, alors j'ai décidé de l'essayer. Essayez sans utiliser la probabilité pour que le fils d'un lycéen puisse comprendre.

Fonction de mise

import random

def play():
    a = random.randint(0, 1)
    if a == 0:
        return 'win'
    else:
        return 'lose'

Définissez une fonction qui renvoie le résultat du jeu.

def test():
    win = 0
    lose = 0
    for i in range(1000):
        if play() == 'win':
            win += 1
        else:
            lose += 1

    print('win: ' + str(win) + ' , lose: ' + str(lose))
    
for i in range(10):
    test()

Le résultat d'essayer ces 1000 fois est affiché 10 fois pour vérifier comment les résultats sont dispersés.


win: 498 , lose: 502
win: 491 , lose: 509
win: 479 , lose: 521
win: 509 , lose: 491
win: 513 , lose: 487
win: 520 , lose: 480
win: 521 , lose: 479
win: 495 , lose: 505
win: 526 , lose: 474
win: 524 , lose: 476

C'est comme ça. Il n'y a pas de problème car le taux de gain est d'environ 50%.

Application de la loi martingale

En tant qu'élève du premier cycle du secondaire, il ne peut pas jouer, mais pour lui, il utilise une bonne somme de 10000 yens comme fonds militaires. La première mise est de 100 yens.

Si vous perdez, doublez la mise et répétez jusqu'à ce que vous gagniez.

def martingale(money, bet):
    times = 1
    while(True):
        if play() == 'win':
            money += bet
            return money, times
        else:
            money -= bet
            bet += bet
            if money <= bet:
                return money, times
        times += 1

Essayez 10 fois et affichez le résultat.

def test():
    money, times = martingale(10000, 100)
    
    if money < 0:
        print('Lose at: ' + str(times) + ', money: ' + str(money))
    else:
        print('Win at: ' + str(times) + ', money: ' + str(money))

for i in range(10):
    test()

Le résultat.

Win at: 4, money: 10100
Win at: 3, money: 10100
Win at: 1, money: 10100
Win at: 2, money: 10100
Win at: 2, money: 10100
Win at: 4, money: 10100
Win at: 1, money: 10100
Win at: 1, money: 10100
Win at: 3, money: 10100
Win at: 2, money: 10100

En fait, je l'ai fait plusieurs fois, mais parfois j'ai perdu. Vous pouvez certainement gagner. Comme le pense mon fils.

Une fois répété

Je veux voir combien de temps cela peut durer. Il se termine lorsque le montant est doublé pour comparer avec le cas de paris de 10 000 yens à la fois. De plus, si le montant est doublé et que la mise est insuffisante, la politique est de recommencer à partir de 100 yens.

def iterate(money, bet):
    day = 1
    duble = money * 2
    while(True):
        money, times = martingale(money, 100)
        if money <= 0:
            return money, day
        elif duble <= money:
            return money, day
        day += 1

Je préfère «sinon» à l'écriture ou aux conditions. Si le processus post-jugement est susceptible d'être compliqué, écrivez une fonction qui renvoie le résultat du jugement. Je m'en fiche ...

Traitez le nombre de répétitions comme le nombre de jours. Si vous partez de 100 yens avec 10 000 yens comme fonds militaires, cela doublera en 100 jours et se terminera. Si tu perds une seule fois

Maintenant, si vous essayez ceci 10 fois comme d'habitude ...

def test():
    money, day = iterate(10000, 100)
    
    print('day: ' + str(day) + ', money: ' + str(money))

for i in range(10):
    test()

Le résultat est

day: 164, money: 20000
day: 100, money: 20000
day: 164, money: 20000
day: 100, money: 20000
day: 98, money: 0
day: 64, money: 0
day: 100, money: 20000
day: 90, money: 0
day: 104, money: 0
day: 20, money: 0

Hmm? C'est 5 victoires et 5 défaites. Je vais perdre un peu. C'est ma préférence personnelle de parier 10 000 yens depuis le début ou de penser que je pourrais jouer beaucoup, mais je voulais vérifier le taux de gain réel.

Essayez un peu plus

Donc, je vais afficher environ 10 fois pour essayer environ 1000 fois.

def test():
    win = 0
    lose = 0
    for i in range(1000):
        money, day = iterate(10000, 100)
        if 0 < money:
            win += 1
        else:
            lose += 1
            
    print('win: ' + str(win) + ', lose: ' + str(lose))

for i in range(10):
    test()

Je l'ai essayé sur paiza.io, mais il s'est avéré être Time Out, alors je l'ai divisé en deux et l'ai exécuté deux fois.

win: 510, lose: 490
win: 498, lose: 502
win: 502, lose: 498
win: 467, lose: 533
win: 496, lose: 504
win: 498, lose: 502
win: 500, lose: 500
win: 527, lose: 473
win: 500, lose: 500
win: 508, lose: 492

Le taux de réussite est de près de 50%.

J'ai essayé d'augmenter les fonds militaires

Alors qu'en est-il de 1 million de yens?

def test():
    win = 0
    lose = 0
    for i in range(1000):
        money, day = iterate(1000000, 100)
        if 0 < money:
            win += 1
        else:
            lose += 1
            
    print('win: ' + str(win) + ', lose: ' + str(lose))

for i in range(10):
    test()

C'était un processus lourd car le nombre de paris a augmenté.

win: 507, lose: 493
win: 489, lose: 511
win: 490, lose: 510
win: 521, lose: 479
win: 497, lose: 503
win: 467, lose: 533
win: 493, lose: 507
win: 497, lose: 503
win: 496, lose: 504
win: 510, lose: 490

En conséquence, le taux de gain est de 50%, ce qui signifie que le résultat ne change pas même si vous pariez en une seule fois ou doublez et augmentez le nombre de fois.

Même si vous préparez 1 million de yens pour faire 100 yens, il semble qu'il ne soit plus utile d'augmenter les fonds. C'était dommage, mon fils.

Sommaire

C'est un programme à expliquer à mon fils de lycée, alors j'ai décidé de l'essayer, pas de probabilités. Il a peut-être été en mesure d'expliquer les calculs parce qu'il a une grande capacité en mathématiques, mais il était aussi susceptible d'avoir un problème avec mes capacités ...

En fait, si vous pariez deux fois, la probabilité de perdre est divisée par deux, mais comme le montant d'argent perdu est doublé, le taux de gain lorsque vous répétez il est le même que lorsque vous pariez en une fois. Il est naturel d'être calme, mais quand il s'agit de gagner, vous serez dupe. (C'est la même chose qu'une institution permanente)

En ce sens, l'essayer semblait être une méthode très efficace.

Addendum - J'ai appris plus tard que cette méthode de vérification s'appelle la méthode de Monte Carlo. (Je ne connaissais que le nom) Je ne suis pas confiant, alors veuillez commenter si quelqu'un dit que c'est vrai.

Impressions

Je l'ai écrit en python inconnu. Un autre fils écrivait python et était un peu intéressé. Je me sens un peu bizarre en écrivant, mais cela devrait être facile à lire.

C'est un secret, mais le premier programme que j'ai construit avait un bug dans les conditions aux limites et le résultat du calcul était un peu rentable ...

Recommended Posts

J'ai confirmé avec des lycéens si cela serait rentable avec la méthode du double pari (méthode Martingale) avec Python
J'ai essayé de refactoriser le code de Python débutant (lycéen)
J'ai essayé de remodeler le code de Python débutant (lycéen) en crunchy orienté objet
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)