2.3 例題(1)

  9.例題2-9 乱数値の保持
 以下に示すのは乱数を生成するプログラムの例です。

 乱数の生成においては種(seed)となる値を元にし、逐次的に乱数を生成していきます。
そのため、乱数をつくる関数の中で、前の乱数の値を保持しておく必要があります。

 以下のプログラムではそれを大域変数を使って実現しています。

<問題>:
 しかしながら、この実現ではプログラム本体では知る必要のないnextという種となる値を記憶する変数を用意する必要があり、不必要な変数を外部に見せているという意味で、スマートなプログラムではありません。これを、静的変数を利用して実現してみなさい。
(a)プログラムリスト

#include <stdio.h>

unsigned long next;

unsigned int random(int k, int m);

int main(void)
{
    int seed, i;
    scanf ("%d", &seed);

    random (0, seed);

    for (i = 0; i < 100; i++) {
      printf ("%d\n", random (1, seed));
    }
}

unsigned int random(int k, int m)
{
    if (k == 0) {
      next = (unsigned long)m;
    } else {
      next = next * 1103515245L + 12345;
    }

    return (unsigned int)(next / 65536L) % 32768; /* 0〜32767の乱数 */
}