カードを混ぜる

カードを混ぜる

shuffle は、1 組 52 枚のカードを混ぜるサブルーチンです。

rand 関数か List::Util モジュールの shuffle 関数を利用して、1 組のカードを混ぜています。


#カードを混ぜる
sub shuffle(\@) {
  my ($stack) = @_;

  if ($] >= 5.008) {#特殊変数 $] は、Perl のバージョンを識別する文字列
    use List::Util;

    @$stack = List::Util::shuffle(0 .. IMAX * NDECK - 1);
  } else {
    my (@flag);#フラグ(0:未使用 1: 使用済)

    #配列を初期化する
    for (0 .. IMAX * NDECK - 1) {
      $flag[$_] = 0;
    }

    #擬似乱数を初期化する
    srand:

    #カードを混ぜる
    for (0 .. IMAX * NDECK - 1) {
      my ($index);#カード番号

      #未使用カードを探す
      while (1) {
        #rand の引数に数値 X を指定→0 以上 X 未満の小数を返す
        #rand の引数を省略         →0 以上 1 未満の小数を返す
        $index = int(rand(IMAX * NDECK));
        last if (!$flag[$index]);
      }

      #カードを設定する
      $$stack[$_] = $index;

      #フラグを使用済にする
      $flag[$index] = 1;
    }
  }
}