次へ: 4.3 文字列値配列の生成 上へ: 4 課題文の作成 前へ: 4.1 乱数生成関数 (PDF ファイル: awk2.pdf)


4.2 ランダムな整数列

さて、0 以上 1 未満の乱数から、ランダムな文字列を生成するには どうすればいいでしょうか。 これは、例えば次のようにすればできます。
  1. アルファベットの文字に $1\sim N$ までの番号をつける
  2. $1\sim N$ までの整数の乱数を 40 回作る
  3. その数字に対応する文字をひとつずつ並べた文字列を作る

rand() は 0 以上 1 未満の数を返すので、 例えばそれを 3 倍すれば 0 以上 3 未満の数になり、 その整数部分をとれば 0,1,2 の数がランダムに得られることになります。 整数部分を求める関数は int() で、

int(x): $x$ の整数部分を返す
となっています。よって、
  x = int(rand()*3)
により、$x$ に 0,1,2 のランダムな数が得られます。

なお、rand() を 2.5 倍したものは 0 以上 2.5 未満の数なので、

  x = int(rand()*2.5)
でも $x$ には 0,1,2 のランダムな数が得られますが、 これでは 0,1,2 の現れる確率が違ってしまいます。

rand() は 0 以上 1 未満の「一様乱数」を生成するように設計されていますので、 rand() の 3 倍の値が

になる確率は等しく、それぞれ 1/3 となります。 ところが、rand() の 2.5 倍だと、 それは 0 以上 2.5 未満の一様乱数になりますので、 それが 2 以上 2.5 未満の値になる確率は、 0 以上 1 未満の値になる確率や 1 以上 2 未満の値になる確率の半分しかありません。

一般に、 $0\leq s<t\leq 1$ に対して、 rand() の値が $s$ 以上 $t$ 未満になる確率は $(t-s)$ となります 3。 これを使って、x = int(rand()*2.5) が 2 となる確率を計算してみましょう。

\begin{eqnarray*}\lefteqn{「\mbox{\tt int(rand()*2.5)} = 2 \mbox{ となる確率}」}...
... rand()} < 1\mbox{ となる確率}」
= 1-\frac{2}{2.5} = \frac{1}{5}\end{eqnarray*}

となります。


次へ: 4.3 文字列値配列の生成 上へ: 4 課題文の作成 前へ: 4.1 乱数生成関数
竹野茂治@新潟工科大学
2006年4月27日