[ 高橋のページ ] [ プログラミングおよび実習II ]

プログラミングおよび実習II 2005年11月24日

今日のテーマ: 疑似乱数

例えば数当てゲームのプログラムを作るとしたら…

  1. コンピュータがある範囲内の適当な数をでたらめに決める
  2. 人間が思いついた数を入力する
  3. 当たりならそう表示して終了,さもなくば2に戻る

というような手順になるでしょう. 今回は,1.で考えているようなでたらめな数(乱数)をC言語で作り出す方法を取り上げます.ただし,でたらめな数といってもまったくのでたらめというわけではなく,例えば「0から99までの整数」というように何らかのルールに則ったもののことです.

というわけでいきなりですが次のプログラムを作って実行してみましょう.

http://tortoise1.math.ryukoku.ac.jp/~takataka/course2005/prog2/random0.png

このプログラムを実行すると,0から19までの整数が10個表示されます. 以下のようなことをして結果がどうなるか観察してみましょう.

ここで登場した二つの関数 rand() と srand() は,次のようなものです

rand()
引数なし.戻り値(int型)は,0以上「ある定められた最大値」以下の整数. rand()が呼ばれる度に,その内部では,「乱数っぽい数」を生成する漸化式にしたがって,前の値から次の値を計算している.
srand()
unsigned int型(符号なしの整数)の数ひとつを引数にとり,それをrand()が生成する乱数の「種」とする.戻り値なし. 種が変われば,rand()が返す乱数も変わる. 乱数の種は,rand()が計算する数列の初期値を決めるもの(ただし,「最初にrand()を呼んだときに返される値」 = 「種の値」 というわけではないことに注意).

上記のように,rand()が生成する値は漸化式によって次々計算されるものですから,真の意味での乱数ではなく,「疑似乱数」と呼ばれています.

ちなみに,rand()が生成する疑似乱数の最大値は,stdlib.h 中で RAND_MAX として定義されています.したがって,

double x;

x = (double)rand() / RAND_MAX;

とかやると,xにはdouble型で0から1までの疑似乱数を代入することができます.

今日の課題

課題1124-A (締切:11月24日)

種と個数を入力したら,その個数分の疑似乱数を出力するプログラム random.c を作成しましょう. ただし,以下のことに注意して下さい.

適当な種や個数で正しく動作することを確認したら,次に以下のようにしてみましょう

課題1124-B (締切:11月24日,課題1124-Aを11月24日に提出した人のみ対象のボーナス課題)

menuコマンドから,数当てゲームを実行できます.これと同じようなゲームのプログラムを作ってみましょう.


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-13 (水) 13:45:19