ルモーリン

すごろくプログラム

投稿:2019-07-16

こちらのツイートからブログを拝見して、自分でも書いてみようと思いました。

こんな感じ。
#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use feature "say";

use Encode::Locale;
use Math::Random::MT;

binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

use constant TRIAL => 1_000_000;
use constant FURIDASHI => (3, 6, 9);
use constant GOAL => 10;

my $mt = Math::Random::MT->new();
my $dice = 0;
for (1 .. TRIAL) {
	my $piece = 0;
	while ($piece < GOAL) {
		$piece += 1 + int $mt->rand(6);
		$dice++;
		$piece = 0 if grep {$_ == $piece} FURIDASHI;
	}
}

say "試行回数は@{[TRIAL]}回";
say "「ふりだしに戻る」マスの位置は@{[FURIDASHI]}";
say sprintf "サイコロを振る回数の期待値は%1.3f", $dice / TRIAL;

期待値は6.35前後となりました。 そもそも、この期待値は合ってるのか?<おい

試行回数は1000000回
「ふりだしに戻る」マスの位置は3 6 9
サイコロを振る回数の期待値は6.354