#!/usr/bin/perl ;# simulations of betting system ;# Programmed by Piroli YUKARINOMIYA (MagicVox) ;# @see http://www.magicvox.net/archive/2006/05181504.php use strict; #validateDice (); strategy1 (); #strategy2 (); #strategy3 (); #strategy4 (); #strategy5a (); #strategy5b (); ;### マーチンゲール法 sub strategy1 { package strategy1; sub init_bet { return 1; } sub hit { my $this_bet = shift; return init_bet (); } sub lose { my $this_bet = shift; return $this_bet * 2; } &main::start (100, \&init_bet, \&hit, \&lose); } ;### グランマーチンゲール法 sub strategy2 { package strategy2; sub init_bet { return 1; } sub hit { my $this_bet = shift; return init_bet (); } sub lose { my $this_bet = shift; ;# 1, 3, 5, 9, 17, ... return $this_bet == 1 ? 3 : $this_bet * 2 - 1; } &main::start (100, \&init_bet, \&hit, \&lose); } ;### パーレー法(逆マーチンゲール法) sub strategy3 { package strategy3; sub init_bet { return 1; } sub hit { my $this_bet = shift; return $this_bet * 2; } sub lose { my $this_bet = shift; return init_bet (); } &main::start (100, \&init_bet, \&hit, \&lose); } ;### ダランベール法 sub strategy4 { package strategy4; sub init_bet { return 1; } sub hit { my $this_bet = shift; return $this_bet + 1; } sub lose { my $this_bet = shift; return init_bet (); } &main::start (100, \&init_bet, \&hit, \&lose); } ;### ピラミッド (a) sub strategy5a { package strategy5a; sub init_bet { return 5; } sub hit { my $this_bet = shift; return 9 < ++$this_bet ? init_bet () : $this_bet; } sub lose { my $this_bet = shift; return --$this_bet < 1 ? init_bet () : $this_bet; } &main::start (100, \&init_bet, \&hit, \&lose); } ;### ピラミッド (b) sub strategy5b { package strategy5b; sub init_bet { return 5; } sub hit { my $this_bet = shift; return 9 < ++$this_bet ? 9 : $this_bet; } sub lose { my $this_bet = shift; return --$this_bet < 1 ? 1 : $this_bet; } &main::start (100, \&init_bet, \&hit, \&lose); } ;# 賭博ループ package main; sub start { my ($property, $init_bet, $hit, $lose) = @_; ;# my $bet = &$init_bet; my $count = 1; do { $property -= $bet; printf "%4d 回目 : 掛金 = %d, 残金 = %d, 結果 = ", $count, $bet, $property; if (doDice ()) { printf "○"; $property += $bet * 2; $bet = &$hit ($bet); } else { printf "×"; $bet = &$lose ($bet); } printf ", 資産 = %d\n", $property; $count++; } while (0 <= $property - $bet); print "はさーん"; } ;# それぞれ50%の確率で 0=丁 1=半 を返す sub doDice { int (rand (2)); } ;# doDice の性能を調べます sub validateDice { my ($han, $chou) = (0, 0); for (my $k = 0; $k < 10; $k++) { print '.'; for (my $j = 0; $j < 1000; $j++) { for (my $i = 0; $i < 1000; $i++) { &doDice () ? $han++ : $chou++; } } } printf "\n0 = %f\n1 = %f\n", $chou * 100.0 / ($han + $chou), $han * 100.0 / ($han + $chou); exit; }