フレンチルーレットのアンプリゾン方式をPythonでシミュレーションしてみた
ルーレットにはアメリカンルーレット、ヨーロピアンルーレット、フレンチルーレットの3種類があります。
更にフレンチルーレットのイーブンベットにはアンプリゾン方式とラパルタージュ方式という2種類のルールがあります。
イーブンベットとは赤・黒ベットや偶数・奇数ベットやハイ・ローベットなど、勝つと賭金と同額(イーブンマネー)が配当としてもらえる賭けのことです。
この中で最も勝てる確率が高いのは、フレンチルーレットのアンプリゾン方式です。
同時にルールも一番ややこしく、Pythonでシミュレーションソフトを作るのも一番大変です。
そこでこのアンプリゾン方式で赤・黒ベットをやるシミュレーションソフトを作ってみました。
「私はアメリカンルーレットやヨーロピアンルーレットにしか興味がない」
という方も安心して下さい。
すべての方式がシミュレーションできるようになっています。
アメリカンルーレットとは?
ルーレットの玉が落ちる場所には1から36までの数字が書いてあり、赤か黒に塗られています。
赤が18個、黒も18個です。
それ以外に緑で塗られている0と00があるのがアメリカンルーレットです。
玉が落ちる場所が全部で38箇所あることになります。
プレーヤーは赤か黒にしか賭けることができず、緑に玉が入ったらプレーヤーはどうやったって勝つことはできません。
ヨーロピアンルーレットとは?
赤と黒の数字が18個ずつあるのはアメリカンルーレットと同じですが、ヨーロピアンルーレットには緑が0の1つしかありません。
従って玉が落ちる場所は全部で37箇所です。
プレーヤーは赤か黒にしか賭けることができず、緑に玉が入ったらプレーヤーはどうやったって勝つことはできないのはアメリカンルーレットと同じです。
ただ、緑が1箇所しかないため、勝てる確率は少し上がります。
フレンチルーレットとは?
フランスはヨーロッパの一部だけあって、玉が落ちる場所が赤と黒が18個ずつ、緑が1個というのはヨーロピアンルーレットと同じです。
ただし、玉が緑に入ってしまった場合に次のような2種類の救済措置があり、カジノによりどちらかのルールが適用されます。
アンプリゾン方式とは?
このルールの場合は、緑(ゼロ)に玉が入ってしまったら賭金がその場に拘留され、同じ色に引き続き賭けることになります。
「その場に拘留」されるとは、赤に賭金を置いていたなら、赤にそのまま賭金が留め置かれるということです。
そして次に玉が落ちた場所の色が前に賭けていた色と同じなら、拘留されていた賭金はプレーヤーに戻されます。
ただし、もし次の玉が落ちた場所の色が前に賭けていた色と異なる場合には、拘留されていた賭金はそのまま没収されます。
例えば、赤に20ドルを賭けていて緑に玉が落ちた場合には、その20ドルはその場に保留されます。
そして次に玉が落ちた場所が赤だった場合には、保留されていた20ドルは戻ってきます。
しかし、もし次の玉が黒や緑に落ちた場合には、保留されていた20ドルは没収されます。
ラパルタージュ方式とは?
このルールの場合は、玉が緑に入ってしまったら賭金の半分だけ戻してもらえます。
アンプリゾン方式ではその場で賭金が拘留されますが、その賭金が戻ってくる確率はほぼ半々です。
従って、ラパルタージュ方式でもアンプリゾン方式でもプレーヤーが勝てる確率(期待値)はほぼ同じです。
しかし確実に言えるのは、このような救済措置があることによってアンプリゾン方式やラパルタージュ方式が適用されるフレンチルーレットは、アメリカンルーレットやヨーロピアンルーレットよりもプレーヤーにとっては有利になります。
還元率の比較
カジノにおいて胴元(カジノ運営者)が運営費として徴収する割合を控除率と言います。
ルーレットの場合には、玉が緑に入るとカジノ側はプレーヤーが赤に賭けていても黒に賭けていてもお金を戻さなくていいので、緑に玉が入る確率がそのまま控除率になります。
そして1から控除率を引いた割合が還元率で、この値が大きいほどプレーヤーにとって有利ということができます。
各方式における還元率は次のように計算できます。
計算根拠や、実際この理論値通りになるの?という点については、こちらの記事で解説しています。
【ルーレットの還元率】理論値になるかPythonで百万回シミュレーションしてみた
アメリカンルーレットの還元率
36÷38=94.7%
ヨーロピアンルーレットの還元率
36÷37=97.3%
フレンチルーレット(アンプリゾン方式)の還元率
36÷37+1÷37✕(18÷37)=98.61%
フレンチルーレット(ラパルタージュ方式)の還元率
36÷37+1÷37÷2=98.65%
Pythonでシミュレーションソフトを作る
フローチャート
下記のような考え方でシミュレーションソフトを作りました。
コーディング
少し冗長ですが、次のようにコーディングできます。
import random
# ルーレット種類の入力
def kind_of_roulette():
global kind, weight, rule
print('ルーレットの種類を入力して下さい(A:アメリカン, E:ヨーロピアン, F:フレンチ) :')
kind = input('>')
if kind == 'A':
print('アメリカンルーレットが選択されました')
weight = [18, 18, 2] #確率ウェイト(赤:18箇所、黒:18箇所、ゼロ:2箇所)
elif kind == 'E':
print('ヨーロピアンルーレットが選択されました')
weight = [18, 18, 1] #確率ウェイト(赤:18箇所、黒:18箇所、ゼロ:1箇所)
else:
print('フレンチルーレットが選択されました')
weight = [18, 18, 1] #確率ウェイト(赤:18箇所、黒:18箇所、ゼロ:1箇所)
print('アンプリゾン方式(E) or ラパルタージュ方式(L) ?:')
rule = input('>')
fund()
# 投下資金額の入力
def fund():
global onhand
print('投下資金額を入力して下さい: ')
onhand = int(input('>'))
place()
# 賭金の入力
def place():
global onhand, placement
print('賭金を入力して下さい: ')
placement = int(input('>'))
if placement > onhand: #手持ち資金が足りない場合
print('手持ち資金が足りません')
place()
else: #手持ち資金が足りる場合
choice()
# 色の選択
def choice():
global answer, placement, hold
print('赤(R)か黒(B)を選択して下さい:')
answer = input('> ')
hold = 0 #保留で1を立てるようにフラグを用意
settlement(placement)
# 精算
def settlement(money):
global result, weight, onhand, hold, rule
color = ['R', 'B', 'G'] #赤、黒、ゼロ
result = random.choices(color, k = 1, weights = weight) #確率ウェイトに基づき赤、黒、ゼロを生成
if result[0] == 'R' and answer == 'R':
if hold == 1: #保留中の場合
print('良かったですね。保留金は返金します')
else: #保留中でない場合
print('勝ちました!')
onhand += money
print(f'手持ち資金は{onhand}です')
place()
elif result[0] == 'B' and answer == 'B':
if hold == 1: #保留中の場合
print('良かったですね。保留金は返金します')
else: #保留中でない場合
print('勝ちました!')
onhand += money
print(f'手持ち資金は{onhand}です')
place()
elif result[0] == 'G' and kind == 'F': #フレンチでゼロが出た場合
if hold == 1: #保留中にゼロが出た場合
print('残念ながら保留金は没収されました')
print(f'手持ち資金は{onhand}です')
place()
else: #最初にゼロが出た場合
if rule == 'E': #アンプリゾン方式の場合
hold = 1
print('賭金を保留します')
onhand = onhand - money
print(f'手持ち資金は{onhand}です')
settlement(money)
else: #ラパルタージュ方式の場合
print('半分を返金します')
onhand = onhand - money + money/2
print(f'手持ち資金は{onhand}です')
place()
else: #違う色が出た場合
if hold == 1: #保留中の場合
print('残念ながら保留金は没収されました')
else: #保留中でない場合
print('負けました!')
onhand -= money
print(f'手持ち資金は{onhand}です')
if onhand == 0: #手持ち資金がなくなった場合
print('増資しますか?(Y or N)')
decide = input('>')
if decide == 'Y': #増資する場合
fund()
else: #増資しない場合
print('ゲーム終了です')
exit
else: #手持ち資金がある場合
place()
kind_of_roulette()
シミュレーション例
ルーレットの種類を入力して下さい(A:アメリカン, E:ヨーロピアン, F:フレンチ) :
>F
フレンチルーレットが選択されました
アンプリゾン方式(E) or ラパルタージュ方式(L) ?:
>E
投下資金額を入力して下さい:
>100
賭金を入力して下さい:
>20
赤(R)か黒(B)を選択して下さい:
> R
負けました!
手持ち資金は80です
賭金を入力して下さい:
>20
赤(R)か黒(B)を選択して下さい:
> B
賭金を保留します
手持ち資金は60です
良かったですね。保留金は返金します
手持ち資金は80です
賭金を入力して下さい:
>80
赤(R)か黒(B)を選択して下さい:
> B
勝ちました!
手持ち資金は160です
賭金を入力して下さい:
>160
赤(R)か黒(B)を選択して下さい:
> B
負けました!
手持ち資金は0です
増資しますか?(Y or N)
>N
ゲーム終了です