2024/09/16(月)宝くじで暮らそう

すっごく昔に、Loto6 を買うときの参考用に単純に 1~43の乱数を生成する perl スクリプトを書いた。何度か購入して1000円くらいあたった気がする。乱数生成器がメルセンヌ・ツイスターなのがこだわり(割とどうでもいい)。多分、普通に買うのと当選率は変わらない。

その後出現率とかを加味したコードも書いてみた。書いてはみたものの、出現データをみるというほどバラツキがない。例えば出現頻度が高い数字一覧のなかで出現頻度が低い数字は 50回あたり 4〜5回。出現頻度が低い数字の一覧の中で頻度が高い数字は 7回とかある。中央値がだいたい7回あたりなんじゃないかと思われる。平均回数は 43 / 6 = 7.16 なのでまぁ、平均と中央値の差もほぼなさそうだ。今出てる出現頻度の偏りはただの偶然ぽい。

なので、出現確率を加味しても多分普通に買うのと当選率は変わらない。

#! /bin/perl
use Math::Random::MT qw(rand srand);
use POSIX qw(floor ceil);

# from https://takarakuji.rakuten.co.jp/data/loto/loto6/numbers_frequency/
# 2024/09/17
my %appear = ('1' => 4,
              '2' => 8,
              '3' => 8,
              '4' => 8,
              '5' => 12,
              '6' => 8,
              '7' => 10,
              '8' => 5,
              '9' => 7,
              '10' => 7,
              '11' => 8,
              '12' => 3,
              '13' => 3,
              '14' => 6,
              '15' => 5,
              '16' => 5,
              '17' => 4,
              '18' => 12,
              '19' => 9,
              '20' => 5,
              '21' => 7,
              '22' => 7,
              '23' => 11,
              '24' => 9,
              '25' => 9,
              '26' => 5,
              '27' => 6,
              '28' => 6,
              '29' => 13,
              '30' => 9,
              '31' => 5,
              '32' => 4,
              '33' => 11,
              '34' => 6,
              '35' => 4,
              '36' => 10,
              '37' => 8,
              '38' => 5,
              '39' => 4,
              '40' => 7,
              '41' => 7,
              '42' => 8,
              '43' => 4,
             );

# 各数字を出現回数だけ格納した配列を作る
my @ar;
while (my ($key, $value) = each(%appear)) {
  my $i = 0;
  # valueの数だけ配列に数字を加える
  while ($i < $value) {
    push @ar, $key;
    $i++;
  }
}

# 配列から要素を取り出していく
my @res; # result

# 乱数の初期化
srand time^$$;

my $i = 0;
while ($i < 6) {
  # 配列の要素数内で乱数を取る
  my $num = floor(rand $#ar);
  # 乱数を添字として数値を取り出す
  my $hit = @ar[$num];
  push @res, $hit;
  # 取り出した要素と同じ数値をを配列から全て削除
  @ar = grep $_ ne $hit, @ar;

  $i++;
}

#表示
@res = sort { $a <=> $b } @res;
$, = ' ';
$\ = "\n";
print @res;

データの用意をスクレイピングとかで自動化できたらいいね。あと、せっかくだから習作として Rust とかで書けばよかったね。