Thinkers'Studio
JavaとC言語の自習ツール
ゲームで使う乱数生成(rand, srand)の使用例

 数当てゲームなどで、ランダムな数を生成したいときには、rand関数を使います。
 今回は、3回勝負のじゃんけんゲームでの使用例を紹介します。

乱数生成のサンプル

【 3回勝負のじゃんけんゲームプログラム rand, srand の使用例 】
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_WIN 3
enum janken { ROCK = 1, SCISSORS = 2, PAPER = 3 };

main()
{
    int cmp, you, cmpw, youw;
    char *str[] = { "グー", "チョキ", "パー" };

    srand( time( NULL ) );
    cmpw = youw = 0;
    printf( "じゃんけん %d回勝負\n", MAX_WIN );
    do {
        printf( "1:グー, 2:チョキ, 3:パー, (q):終了 > " );
        if( scanf( "%d" , &you ) != 1 ) break;
        if( you <= 0 || 3 < you ) break;
        cmp = rand() % 3 + 1;
        printf( " You:%s, Cmp:%s", str[you-1], str[cmp-1] );
        if( you == cmp ) {
            printf( " [あいこ!]\n" );
        } else if( (you == ROCK && cmp == SCISSORS) 
                || (you == PAPER && cmp == ROCK) 
                || (you == SCISSORS && cmp == PAPER) ) {
            printf( " [勝ち!]\n" ); youw++;
        } else {
            printf( " [負け!]\n" ); cmpw++;
        }
    } while( youw < MAX_WIN && cmpw < MAX_WIN );

    if( youw == MAX_WIN ) printf( "あなたの勝ちです\n" );
    if( cmpw == MAX_WIN ) printf( "コンピュータの勝ちです\n" );
}
 実行結果例
じゃんけん 3回勝負
1:グー, 2:チョキ, 3:パー, (q):終了 > 1
 You:グー, Cmp:チョキ [勝ち!]
1:グー, 2:チョキ, 3:パー, (q):終了 > 2
 You:チョキ, Cmp:グー [負け!]
1:グー, 2:チョキ, 3:パー, (q):終了 > 3
 You:パー, Cmp:パー [あいこ!]
1:グー, 2:チョキ, 3:パー, (q):終了 > 1
 You:グー, Cmp:チョキ [勝ち!]
1:グー, 2:チョキ, 3:パー, (q):終了 > 2
 You:チョキ, Cmp:パー [勝ち!]
あなたの勝ちです
 you と cmp の手が同じなら [あいこ!] です。
 その下の勝ち負け判定では、enum で整数値に名前をつけたものを使って、コードを読みやすくしています。

擬似乱数をつくる

【 擬似乱数を生成する関数 】
 int rand( void )   //0からRAND_MAXまでの範囲の擬似乱数整数を返す

rand関数から返された値を利用したい範囲にする

 剰余の演算子 % を使います。
 cmp = rand() % 3 + 1;  //randから返された値を1〜3の範囲にする
 3 で割った余りは 0〜2 のいずれかです。1〜3の値が欲しければ、それに +1 して使います。

srand 関数で、同じセットを生成するか別のセットを生成するか指定する

【 擬似乱数の系列の種を指定する関数 】
 void srand( unsigned int seed )   //seedで指定した系列とする
 プログラム実行の度に異なる乱数列を作りたい場合は、seed に現在時刻を指定します。
 srand( time( NULL ) ); //毎回異なる時刻を種にする
 毎回、同じ数字のセットを作りたい場合は定数を指定します。 srand の呼び出しを省略すると、seed = 1 としたのと同じです。

(今回のクイズです)
 サイコロを使ったプログラム用に 1〜6 の範囲の乱数を生成するには、rand を使ってどのように書けばよいでしょうか?
    (答えは、次回のC言語の Tips で ・・・)

[ 関連記事 ] 数当てゲーム

前回のクイズの答え: (3) (前回の問題を見る
 関数引数に配列サイズを指定しても、それが関数の機能に影響することはありません。元の配列サイズが、引数のサイズより大きくても、コンパイルや実行でエラーになることもありません。