1998 年度「計算機基礎論3B」 1999-01-22

課題が済んでしまった人のためのおまけ --- 乱数発生

関数 rand()0 以上 RAND_MAX 以下の乱数を返します。 rand() を使うときは最初に「#include <stdlib.h>」が必要です。 次のプログラムは 10 個の乱数を発生させ、 最後に RAND_MAX の値を印字するサンプルプログラムです。

== rand.c ==================================================
#include <stdio.h>
#include <stdlib.h>

main() {
    int i;

    for (i=0; i<10; i++) {
        printf("%d\n", rand());
    }
    printf("RAND_MAX is %d\n", RAND_MAX);
}
============================================================
ただし、 乱数といってもコンピュータが計算で疑似的に作り出すものなので実は規則的です。 上のプログラムは毎回同じ結果を出力するはずです。

それではいやだという人は、 現在時刻で乱数の種(たね)を決めるといいでしょう。 time() は現在時刻で決まるある数を返す関数、 srand() は乱数の種を決める関数です。 「(unsigned int)」とか「NULL」 とかは今は説明しません。 time() を使うには最初に「#include <time.h>」が必要です。

== rand2.c =================================================
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main() {
    int i;

    srand((unsigned int)time(NULL));
    for (i=0; i<10; i++) {
        printf("%d\n", rand());
    }
}
============================================================

これを使うと、簡単なゲームが作れます。 たとえばサイコロを振って遊ぶすごろくのようなゲームを作るなら、 サイコロを振るところは発生させた乱数を 6 で割った余りを求めるようにすればよいでしょう。 RAND_MAX が mod 6 で 5 に等しくない場合、 厳密には目の出る確率が等しくありませんが、 それをどうするかは各自考えてください。 トランプゲームの場合、 カードを5枚抜き出すとしたらその中に同じカードがあってはいけないのでそこにも工夫がいります。 また、普通のコンピュータにはスペード、 ハート、クラブ、ダイヤの記号はありませんので --- ワープロなどにあるのはその機械なりソフトなりが独自に作った機能です ---、 実際にトランプゲームの記録に使われているように S, H, C, D で代用するとか、 「★●◆■▲▼」などの記号を自分で考えてあてるとかしてみてください。

 ※ 一般的なコンピュータで使える(いわゆる)全角文字の一覧は http://math.s.kanazawa-u.ac.jp/~iwase/jis.html にある。

また、乱数はプログラムのチェックにも使えます。 例えば、 ある決められた配列に代入された整数を小さい順に並べかえる関数 void mysort(void)を書くとしましょう。 (最初の void は返す値がないことを示し、 カッコの中の void は引数がないことを示します。) 次のプログラムを何度も実行することにより、 mysort が正しく書けているかどうかをチェックすることができます。

#include ...
#define N 10000

void mysort(void);

int a[N];

main() {
    乱数を発生させ、a[0] から a[N-1] に代入する
    mysort();
    正しく並べかえられたかどうかチェックする
}

void mysort(void) {
    ....
}

 ※ このプログラムは「疑似プログラム」 なのでもちろんこのままではコンパイル不可能である。

最後のチェックの部分は、 a[i] > a[i+1] となっているところを発見したら 「違っている」と出力する、 などとすればよいでしょう。

効率よく並べかえる方法については、 いろいろな研究がなされています。

次週予告

次回からは第4実習室を使い、数学の複雑な式も打てる“ワープロ”、 TeX の実習を行なう予定です。 以下の第4実習室のコンピュータの使い方を今週のうちにメモしておけば、 来週はいきなり第4実習室に行けて便利です。

第四実習室のコンピュータの使い方

第四実習室にならんでいるのが、 いままで使っていた WS です。 本体の電源スイッチは管理者だけが入れたり切ったりするもので、 我々はさわってはいけません。

使うときはディスプレイの電源をいれます。 ディスプレイの電源スイッチは画面の右下。 電源がはいるとスイッチの左脇の部分が緑色に光ります。 画面に「ws?? console login: 」 (「??」は実際は数字二文字、以下同様) と出ますのでそこにユーザ名をいれて Return, つぎに「Password: 」と出ますのでパスワードを入れて Return です。

 ※ Return キーはパソコンの Enter キーの位置にある。

「~」などの特殊な文字のキーの位置は第三実習室のパソコンとは異なっている場合がありますので注意してください。

しばらく待つと色のついた地にウィンドウのある画面が出てきます。

終わるときはウィンドウのないところにマウスカーソルをもってきて右ボタンを押し、 押したままマウスカーソルを下に動かして 「終了...」で離します。確認メッセージが出ますから、 左ボタンのクリックで選んでください。 しばらくして白い画面にもどり「ws?? console login:」 が出たらディスプレイの電源スイッチを切ってください。

WS の Netscape の使い方について

「コマンドツール(コンソール)」「コマンドツール」「シェルツール」 と書かれているウィンドウは、 いままで使ってきたパソコンの Telnet のウィンドウと同じようなものだと思ってください。 どれかのなかに 「ws??{eb00d??}1%」 のようなプロンプトが出ているところをマウスの左ボタンでクリックし、 「netscape &」と打って Return を押せば Netscape が起動されます。

あとは特に違いを意識せずに使えると思いますから省略しますが、 パソコンと違って WS では「ブックマーク」が有効に使えます。 気に入ったページがあったら、 それが表示された状態で左上の「ブックマーク」を押し、 押したままマウスカーソルを下げて「ブックマークを追加」で離します。 するとそのページの場所を示す文字列が各自のファイルの中に書き込まれますので、 次にそのページを見るときは 「ブックマーク」を押して一覧の中から選ぶだけですみます。

 ※ この Netscape は半角の「¥」を半角の「\」と表示するようだ。 この二つは表示が違うだけで内部では全く同じに扱われる。 英語圏の半角「\」は日本では「¥」と表示される、 と思っておいて(だいたい)よろしい。 なお、この記号は「バックスラッシュ」と呼ばれる。 いままで出てきた「/」(スラッシュ)とは向きが反対なので注意。


岩瀬順一 <iwase@math.s.kanazawa-u.ac.jp>