« SDカード・アダプタ(1) | メイン | SDカード・アダプタ(2) »

モールス受信練習機を乱数で遊んでみる(1/2)


 乱数という言葉を聞いたことがありますか? 乱れる数と書きますが、サイコロの目のように毎回何が出るかわからない数(ランダムな数)のことをいいます。ここでは乱数を発生する関数randを使ってサイコロやおみくじを作ってみます。プログラムの雛形として使うのは「モールス受信練習機でタイマとメトロノームを作ってみる」で使ったEJ-sound-timer.zipです。

rand関数とは
 HI-TECH C コンパイラの rand 関数は0から32767までの間のランダムな数を返します。つまり式の中にrand()を書くと、その値は0から32767の間で何になるかはわからないということです。サイコロを作るにはどうしたらよいでしょうか? ここで割り算の出番です。
n = (rand() % 6) + 1;
とします。% 記号は割り算のあまりを求める記号です。どんな整数でも6で割ったあまりは0から5の範囲になります。それに1を足したものをnに代入しているので、nの値は1から6になります。

 rand関数を使うときに注意が必要なことが一つあります。それはrand関数は本当の乱数を発生するのではないということです。実は計算で疑似乱数を求めているので、毎回出てくる値を比較するとランダムに見えるのですが、rand関数を呼び出す回数が一定なら、同じ値になってしまうのです。そこで、rand関数を呼ぶ回数が一定にならないような工夫が必要になります(ここでは省略しますが、あるいはsrand関数を使います)。

サイコロの目を表す
 サイコロの目を表すにはビープ音を使うことにします。forループと先ほどの変数nを使って、目の数の回数だけ音を出すには、
for (i=0; i<n; i++) {
    beep(1200, 100);
    delay100ms(2);
}
とすればOKです。

電子サイコロのmain関数
 電子サイコロを作ってみました。main関数は次のようになっています。最初に変数iとnを宣言しています。そして、for(;;)の無限ループの中でスイッチが押されるまでの間、乱数を繰り返し求めています。電源を入れてからスイッチを押すまでの時間は一定ではないので、毎回何が出てくるかわからなくなっています。実際にサイコロの目を表すビープ音は次の for ループで n 回(1から6回)繰り返して作っています。

void
main(void)
{
    int i, n;

    init();                 // 初期化

    for (;;) {
        while (BIT_SW != 0) // タクト・スイッチ SW1 が押されるまで待つ
        {
        n = (rand() % 6) + 1; // 乱数 (0から32767)を6で割った余り(0から5)に1を足すと
                        // 1から6になる
            }

        for (i=0; i<n; i++) {
        beep(1200, 100);
        delay100ms(2);
        }
    }
}
(光永 法明)

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/6639





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/