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

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

準備

準備として以下のことを行ってください

今日のテーマ: 疑似乱数

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

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

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

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

http://tortoise1.math.ryukoku.ac.jp/~takataka/course2006/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 (締切:今日の実習終了時)

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

適当な種や個数で正しく動作することを確認したら,チェックを受けてください.

課題1124-B (締切:次回の実習終了時,締切後チェック対象外)

まずはこのファイルを手元に sortcheck.c という名前で保存して,エディタで中身を確認しましょう.

次に,今まで自分で作ったソースと組み合わせてコンパイル&実行し,適当な値を入力して動作確認しましょう.その際に使うソートの関数は,四つ(単純選択法,バブル,ヒープ,クイック)のうちのいずれかひとつで構いません.

[コンパイルエラーのありがちな原因]

上記の動作確認ができたら,今度は課題Aのプログラムと組み合わせて,次のように実行してみましょう(課題A,Bの実行形式がそれぞれrandom,sortという名前と仮定してます)

$ ./random | ./sort

このようにすると,randomの出力が端末画面に表示されるかわりにsortに渡されます(このような実行の仕方については,課題1027-Cに解説があります).

動作確認して「正しくソートできたみたいです」となったら,チェックを受けてください.

課題1124-C (課題1124-A,Bを今日中に提出した人のみ対象のおまけ課題,締切:次回の実習終了時,締切後チェック対象外)

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


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