🎲🐍 ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ³Ρ€Ρƒ Π² кости Π½Π° Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ учимся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ для прогнозирования вСроятностСй.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ?

ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ – это Ρ‚ΠΈΠΏ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ возникновСния Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ события ΠΈΠ·-Π·Π° участия случайных Π²Π΅Π»ΠΈΡ‡ΠΈΠ½. Алгоритм основан Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ случайной Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ событий со случайными Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ большоС число Ρ€Π°Π· для получСния ΠΎΡ†Π΅Π½ΠΊΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² экономикС, Π°Π·Π°Ρ€Ρ‚Π½Ρ‹Ρ… ΠΈΠ³Ρ€Π°Ρ…, ΠΌΠ°ΡˆΠΈΠ½ΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠΈ, энСргСтичСской отрасли. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π·Π½Π°Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΌΠ½ΠΎΠ³ΠΈΡ… областСй. МодСль ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ³Ρ€Ρ‹ Π² кости.

Π˜Π³Ρ€Π° Π² кости

Π’ этой ΠΈΠ³Ρ€Π΅ Π±ΡƒΠ΄ΡƒΡ‚ задСйствованы 2 ΡˆΠ΅ΡΡ‚ΠΈΠ³Ρ€Π°Π½Π½Ρ‹Ρ… ΠΊΡƒΠ±ΠΈΠΊΠ°. Для Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€ΠΎΠΊΡƒ трСбуСтся Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ число Π½Π° ΠΎΠ±ΠΎΠΈΡ… ΠΊΡƒΠ±ΠΈΠΊΠ°Ρ…. ШСстигранный ΠΊΡƒΠ±ΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ 6 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… исходов (1, 2, 3, 4, 5 ΠΈ 6). Π‘ двумя ΠΊΡƒΠ±ΠΈΠΊΠ°ΠΌΠΈ 36 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… исходов (1 ΠΈ 1, 1 ΠΈ 2, 1 ΠΈ 3 ΠΈ Ρ‚. Π΄., ΠΈΠ»ΠΈ 6 Ρ… 6 = 36 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²). Π’ этой ΠΈΠ³Ρ€Π΅ Ρƒ завСдСния большС шансов Π½Π° ΠΏΠΎΠ±Π΅Π΄Ρƒ (30 исходов ΠΏΡ€ΠΎΡ‚ΠΈΠ² 6 Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²), ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρƒ завСдСния Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ прСимущСство.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с баланса Π² 1000$ ΠΈ Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ всС, поэтому ставит 1$ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ бросок (ΠΎΠ±Π° ΠΊΡƒΠ±ΠΈΠΊΠ°) ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 1000 бросков. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‰Π΅Π΄Ρ€ΠΎΠ΅ ΠΈ Π²Ρ‹ΠΏΠ»Π°Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π² 4 Ρ€Π°Π·Π° большС ставки, ΠΊΠΎΠ³Π΄Π° ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚. НапримСр, Ссли ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ бросок, баланс увСличится Π½Π° 4$, ΠΈ Ρ€Π°ΡƒΠ½Π΄ закончится с 1004$. Если Ρ‡ΡƒΠ΄ΠΎΠΌ получится Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ ΡΠ΅Ρ€ΠΈΡŽ ΠΈΠ· 1000 бросков, Ρ‚ΠΎ ΠΈΡ‚ΠΎΠ³ΠΎ получится 5000$. Π’ случаС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π°ΡƒΠ½Π΄Π° получится 0$.

Π˜ΠΌΠΏΠΎΡ€Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python

Π‘ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ³Ρ€Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, сдСлал Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€. НачнСм ΠΊΠΎΠ΄ с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python: Pyplot ΠΈΠ· Matplotlib ΠΈ random. Для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pyplot, для модСлирования броска ΡˆΠ΅ΡΡ‚ΠΈΠ³Ρ€Π°Π½Π½ΠΎΠΉ ΠΈΠ³Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ кости – random.

# Π˜ΠΌΠΏΠΎΡ€Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ
import matplotlib.pyplot as plt
import random

Ѐункция броска ΠΊΡƒΠ±ΠΈΠΊΠΎΠ²

Π”Π°Π»Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ случайноС Ρ†Π΅Π»ΠΎΠ΅ число ΠΎΡ‚ 1 Π΄ΠΎ 6 для ΠΎΠ±Π΅ΠΈΡ… костСй (имитация броска). Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Π΅ΠΈΡ… костСй ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ – ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ броски ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ПозТС это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для опрСдСлСния дСйствий Π² ΠΊΠΎΠ΄Π΅.

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ броска ΠΊΡƒΠ±ΠΈΠΊΠ°
def roll_dice():
    die_1 = random.randint(1, 6)
    die_2 = random.randint(1, 6)

    # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° костях ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ
    if die_1 == die_2:
        same_num = True
    else:
        same_num = False
    return same_num

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ отслСТиваСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

КаТдоС ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π½Π°Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ трСбуСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΠΈΡΡ‹Π²Π°Π»Π°ΡΡŒ ΠΈΠ³Ρ€Π°. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ бросков Π·Π° ΠΈΠ³Ρ€Ρƒ 1000 Ρ€Π°Π·, сумма Π·Π° бросок 1$. Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ – сколько Ρ€Π°Π· ΠΈΠ³Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ качСствС счСтчика ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ num_simulations. Π§Π΅ΠΌ большС это число, Ρ‚Π΅ΠΌ Ρ‚ΠΎΡ‡Π½Π΅Π΅ прогнозируСмая Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ соотвСтствуСт истинному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Число ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, растСт с ростом слоТности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, поэтому трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, какая информация Π½ΡƒΠΆΠ½Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° (Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π·Π° ΠΈΠ³Ρ€Ρƒ, Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΠΎΠ±Ρ‰Π΅Π΅ число бросков) ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ баланс для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ симуляции (ΠΈΠ³Ρ€Ρ‹). Π­Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ списки ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹.

# Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
num_simulations = 10000
max_num_rolls = 1000
bet = 1

# ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
win_probability = []
end_balance = []

Настройка Ρ„ΠΈΠ³ΡƒΡ€Ρ‹

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг – это настройка Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ запуском симуляции: это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ ΠΊ рисунку послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. ПослС запуска всСх симуляций ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, для симуляции баланса
fig = plt.figure()
plt.title("Monte Carlo Dice Game [" + str(num_simulations) + "   
          simulations]")
plt.xlabel("Roll Number")
plt.ylabel("Balance [$]")
plt.xlim([0, max_num_rolls])

ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ

Π’ ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅ 2 Ρ†ΠΈΠΊΠ»Π°: внСшний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»-Π²ΠΎ симуляций (10000) ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ (1000 бросков). ΠŸΠ΅Ρ€Π΅Π΄ запуском ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° while инициализируСтся:

  • баланс ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΊΠ°ΠΊ 1000$(Π² Π²ΠΈΠ΄Π΅ списка для построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²);
  • количСство бросков ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ΠΉ.

Π¦ΠΈΠΊΠ» while Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ Π½Π° 1000 бросков. Π’Π½ΡƒΡ‚Ρ€ΠΈ этого Ρ†ΠΈΠΊΠ»Π° Π±Ρ€ΠΎΡΠ°ΡŽΡ‚ΡΡ кости, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ roll_dice() для опрСдСлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Если кости ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ – Π² список баланса добавляСтся 4-кратная ставка ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΊ счСту ΠΈΠ³Ρ€ΠΎΠΊΠ°. Если кости Ρ€Π°Π·Π½Ρ‹Π΅ – вычитаСтся ставка ΠΈΠ· списка баланса. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ броска добавляСм счСтчик Π² список num_rolls.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство бросков достигло 1000, рассчитываСм Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠ°ΠΊ количСство Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ΠΉ, Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΎΠ±Ρ‰Π΅Π΅ количСство бросков. БохраняСм ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ баланс Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Π² отслСТиваСмой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ end_balance.

# Π¦ΠΈΠΊΠ» for запускаСт ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ количСство симуляций
for i in range(num_simulations):
    balance = [1000]
    num_rolls = [0]
    num_wins = 0
    # ВыполняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ 1000 Ρ€Π°Π·
    while num_rolls[-1] < max_num_rolls:
        same = roll_dice()
        # Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ссли кости ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅
        if same:
            balance.append(balance[-1] + 4 * bet)
            num_wins += 1
        # Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ссли кости Ρ€Π°Π·Π½Ρ‹Π΅
        else:
            balance.append(balance[-1] - bet)

        num_rolls.append(num_rolls[-1] + 1)
    # БохраняСм ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ добавляСм строку ΠΊ рисунку
    win_probability.append(num_wins/num_rolls[-1])
    end_balance.append(balance[-1])
    plt.plot(num_rolls, balance)

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

ПослСдний шаг – Π²Ρ‹Π²ΠΎΠ΄ осмыслСнных Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· отслСТиваСмых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ (ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅), ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π² Ρ†ΠΈΠΊΠ»Π΅ for. Π’Π°ΠΊΠΆΠ΅ рассчитаСм ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ ΠΎΠ±Ρ‰ΡƒΡŽ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ баланс, усрСдняя списки win_probability ΠΈ end_balance.

# Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ модСлирования
plt.show()

# УсрСднСнная Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ баланса
overall_win_probability = sum(win_probability)/len(win_probability)
overall_end_balance = sum(end_balance)/len(end_balance)
# Π’Ρ‹Π²ΠΎΠ΄ срСдних Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
print("Average win probability after " + str(num_simulations) + "   
       runs: " + str(overall_win_probability))
print("Average ending balance after " + str(num_simulations) + " 
       runs: $" + str(overall_end_balance))
ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ Π² кости:

Average win probability after 10000runs: 0.16666139999999954
Average ending balance after 10000runs: $833.307

Анализ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Из рисунка Π²Ρ‹ΡˆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ Ρ€Π΅Π΄ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ послС 1000 бросков. Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ баланс 10000 симуляций составляСт 833,66$ (ΠΈΠ·-Π·Π° Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ различия Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²). Казино остаСтся Π² Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ Π΄Π°ΠΆΠ΅, Ссли Π²Ρ‹ΠΏΠ»Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° большС ΠΏΡ€ΠΈ ΠΏΠΎΠ±Π΅Π΄Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠ°.

Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° составляСт 0.1667 ΠΈΠ»ΠΈ 1/6. Π’Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ° 6 Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… исходов ΠΈΠ· 36 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ…. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти 2 числа ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π΅Ρ‚ 6 ΠΈΠ· 36 бросков, ΠΈΠ»ΠΈ 1/6 бросков, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·Ρƒ ΠœΠΎΠ½Ρ‚Π΅-ΠšΠ°Ρ€Π»ΠΎ.

***

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 ноября 2019

DeepFake-Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»: создаСм собствСнный Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊ Π² DeepFaceLab

РассказываСм ΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DeepFake ΠΈ шаг Π·Π° шагом учимся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊΠΈ Π² ...
admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
14 июля 2017

ПишСм свою Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ: пошаговоС руководство

ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π³Π°ΠΉΠ΄ ΠΏΡ€ΠΎ Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… элСмС...