1 はじめに

C 言語の rand() という標準関数は、0 から RAMD_MAX1 の間の 整数の乱数を返す。 もちろん、実際にはある規則によって疑似乱数列を生成するだけであるが、 これが一様な乱数であると仮定して、次のような問題を考えてみる:
rand() を用いて、 与えられた実数値 $r$ ($0\leq r\leq 1$) に対して、 確率 $r$ で 1、確率 $1-r$ で 0 を返す関数を作るには どのようにするのがいいか

容易に想像できるだろうが、 if 文を使ってほぼこれを満たす関数を作ることはそれほど難しくはない。 例えば C の関数として書けば次のような具合である:

  int rand_real(double r)
  {
      int x;
      double y;

      x = rand();
      y = x/(double)RAND_MAX; /* 0.0 <= y <= 1.0 */
      if (y <= r) return 1;
      else return 0;
  }
すなわち、$x$ を rand() の値とし、
\begin{displaymath}
\frac{x}{\mbox{\tt RAND\_MAX}}\leq r
\end{displaymath}

ならば 1 を、そうでなければ 0 を返すようにするわけである。 これは、それなりによさそうであるが、 このようなものの妥当性について、少し数学的に検討をしてみたい。

竹野茂治@新潟工科大学
2007年5月31日