乱数

乱数


サイト全体の目次

稿


稿

乱数 1

このセクションのソース

この章では、乱数についてやりますが、乱数を発生させる方法は、非常に簡単です。なお、今回使う「rand」「srand」関数は「stdlib.h」に定義されています。

/*01*/ #include <stdio.h>
/*02*/ #include <stdlib.h>
/*03*/ 
/*04*/ main()
/*05*/ {
/*06*/   int x, i;
/*07*/ 
/*08*/   printf("電子さいころです。\n");
/*09*/   for(i = 1; i < 5; i++){
/*10*/     x = rand() % 6 + 1;
/*11*/     printf(" %d 回目は %d が出ました。\n", i, x);
/*12*/   }
/*13*/ 
/*14*/   return 0;
/*15*/ }

(untitled)

乱数を発生させるにはrand関数を使います。引数は必要なく、この関数は「0」から定数「RAND_MAX」までのint 型整数を返します。ここで「RAND_MAX」はそれぞれのコンパイラで定義されていて、普通は「32,767」となっています。ここでも rand 関数は「0~32,767」の値を返すものと考えます。

さて、rand 関数は「0~32767」までの値を返してくるので、さいころのように「1~6」までの値がほしい場合は、「6」で割った「余り」を使います。つまり「%」演算子ですね。ただ、「6」で割った場合の余りは「0~5」ですから「1」足します。

しかし、このままでは問題があります。このプログラムをコンパイルしたら、連続して2、3回実行してみてください。すると、見てわかると思いますが、まったく同じ順で値が出力されてしまいます。これは「種」をまいていないからです。では、種をまきましょう。

乱数 2

(untitled)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main()
{
	int x, i;

	srand((unsigned int)time(NULL));
	printf("電子さいころです。\n");
	for(i = 1; i < 5; i++){
		x = rand() % 6 + 1;
		printf(" %d 回目は %d が出ました。\n", i, x);
	}

	return 0;
}

(untitled)

rand 関数にとって「種をまく」とは、いわば「初期化する」という意味になります。srandという関数がありますね。これが種をまく関数です。rand 関数では、srand 関数の引数でとった値をもとに乱数を生成します。

srand 関数の引数は「unsigned int」型です。とはいえ、ここに「1」とか「2」とかの定数を書いては意味がありません。種が同じになってしまっては、毎回同じパターンの値になってしまいます。そこで、可変的な種として普通は「時間」を使います。つまり time 関数ですね。ただし、time 関数の戻り値は time_t 型なので、「unsigned int」に型キャストして使ってください。

ちなみに、srand 関数はプログラムの最初で一度だけ使えば、以降の rand 関数すべてに有効です。


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.