[ [[高橋のページ:http://tortoise1.math.ryukoku.ac.jp/~takataka/index-j.html]] ]
[ [[プログラミングおよび実習II]] ]

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

#contents

**今日のテーマ: 疑似乱数

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

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

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

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

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

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

-このプログラムを何回も実行してみる
-9行目の関数 srand() の引数をいろいろ変えてみる
-11行目の数 20 をいろいろ変えてみる

ここで登場した二つの関数 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 を作成しましょう.
ただし,以下のことに注意して下さい.

-種はunsigned int型の変数に入れる.scanf()で読み込むときは,int型なら"%d"やけど,unsigned int型のときは….手持ちの本などで調べてみましょう(C言語の本も持たずに実習に取り組もうなんてしてませんよね).
-疑似乱数の値は,0から(個数-1)までとする.例えば100個なら,0から99まで.
-最初に個数を出力し,つづけて個数分の疑似乱数を出力する

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

-このプログラムをコンパイルしてできる実行形式の名前を random として,その出力を次のようにパイプ('|')を使ってならべかえのプログラムに入力できるようにする
 $ ./random | ./selectionsort
このようにすると,randomの出力がパイプを通してselectionsortに渡されます(パイプについては,[[課題1027-C>プログラミングおよび実習II/20051027#pipe]]に少し解説があります).


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

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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS