2.9 偏りのある乱数を生成する

生成される値の分布を不均一にしたい。

# 標準偏差1, 平均0の正規分布に従った乱数を生成する方法
sub gaussian_rand {
  my ($u1, $u2);  # 均等に分布した乱数
  my $w;               # 偏差(重み)
  my ($g1, $g2);  # ガウス分布の数値

  do {
    $u1 = 2 * rand() -1;
    $u2 = 2 * rand() -1;
    $w = $u1*$u1 + $u2*$u2;
  } while ($w >= 1 || $w == 0);

  $w = sqrt ( (-2 * log($w) ) / $w );
  $g2 = $u1 * $w;
  $g1 = $u2 * $w;
  # 呼び出し側の要求に従い、両方の値を返すか、1つの値を返す。
  return wantarray ? ($g1, $g2) : $g1;
}