解説

C言語で乱数を扱うサンプルです。

乱数(擬似乱数)を使うと、ゲームのキャラクターの動きやイベントの確率を調整したり、
アプリケーションのテストで様々な値を投入できて便利です。

ポイント
  1. srand関数で乱数を初期化する
    1. 初期化しないと、毎回同じ乱数列を取得してしまいます。
  2. rand関数で擬似乱数を取得する
    1. rand()関数の戻り値が擬似乱数なので、お好きなように
  3. 余りを求める事で、乱数の範囲を自分の好みに調整できます
    1. rand() % 6; // サイコロ風 0 ~ 5
    2. rand() % 100; // 百分率 0 ~ 99
    3. rand() % 80 + 20; // 20 ~ 99 半端な範囲を求める時は、余りを求めて少し数字を足します
    4. rand() % 24; // 手持ちの24個の駒から、ランダムに動かす駒を決めたりもできます
    5. if (rand() % 100 < 20) { ... } // 20%の確率で発生するイベントの管理
    6. if (rand() % 100 < x) { ... } // 確率x(0 ~ 100%)で発生するイベントの管理

サンプルソース rand.c

// 乱数を使ってみよう
// ポイント1.srand関数で乱数を初期化する
//     初期化しないと、毎回同じ乱数列を取得してしまいます。
// ポイント2.rand関数で擬似乱数を取得する
//     rand()関数の戻り値が擬似乱数なので、お好きなように
// ポイント3.余りを求める事で、乱数の範囲を自分の好みに調整できます
//     rand() % 6; // サイコロ風 0 ~ 5
//     rand() % 100; // 百分率 0 ~ 99
//     rand() % 80 + 20; // 20 ~ 99 半端な範囲を求める時は、余りを求めて少し数字を足します
//     rand() % 24; // 手持ちの24個の駒から、ランダムに動かす駒を決めたりもできます
//     if (rand() % 100 < 20) { ... } // 20%の確率で発生するイベントの管理
//     if (rand() % 100 < x) { ... } // 確率x(0 ~ 100%)で発生するイベントの管理
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
 
int main(void) {
	int i, r, x, c;
	// ポイント1.srand関数で乱数を初期化する
	srand(time(NULL ));
 
	// ポイント2.rand関数で擬似乱数を取得する
	// 無加工 0~RAND_MAX
	printf("無加工 0~%d\n", RAND_MAX);
	for (i = 0; i < 10; i++) {
		r = rand();
		printf("%d, ", rand());
	}
	printf("\n\n");
 
	// ポイント3.余りを求める事で、乱数の範囲を自分の好みに調整できます
	//     rand() % 6; // サイコロ風 0 ~ 5
	printf("サイコロ風 0~5\n");
	for (i = 0; i < 10; i++) {
		r = rand() % 6;
		printf("%d, ", r);
	}
	printf("\n\n");
 
	//     rand() % 100; // 百分率 0 ~ 99
	printf("100分率 0~99\n");
	for (i = 0; i < 10; i++) {
		r = rand() % 100;
		printf("%d, ", r);
	}
	printf("\n\n");
 
	//     rand() % 80 + 20; // 20 ~ 99 半端な範囲を求める時は、余りを求めて少し数字を足します
	printf("100分率 0~99\n");
	for (i = 0; i < 10; i++) {
		r = rand() % 70 + 20;
		printf("%d, ", r);
	}
	printf("\n\n");
 
	//     rand() % 24; // 手持ちの24個の駒から、ランダムに動かす駒を決めたりもできます
	for (i = 0; i < 3; i++) {
		r = rand() % 24;
		printf("%d番の駒を動かします\n", r);
	}
	printf("\n");
 
	//     if (rand() % 100 < 20) { ... } // 20%の確率で発生するイベントの管理
	printf("20%%の確率で発生するイベントです。\n");
	c = 0;
	for (i = 0; i < 100; i++) {
		if (rand() % 100 < 20) {
			printf("!");
			c++;
		}
	}
	printf("\n100回中%d回イベントが発生しました。\n\n", c);
 
	//     if (rand() % 100 < x) { ... } // 確率x(0 ~ 100%)で発生するイベントの管理
	x = rand() % 100;
	c = 0;
	printf("%d%%の確率で発生するイベントです。\n", x);
	for (i = 0; i < 100; i++) {
		if (rand() % 100 < x) {
			printf("!");
			c++;
		}
	}
	printf("\n100回中%d回イベントが発生しました。\n\n", c);
 
	return EXIT_SUCCESS;
}
 

実行結果 ※実行するたびに実行結果が変わります

無加工 032767
19571, 11130, 6519, 27779, 25295, 15893, 3947, 24267, 29651, 29063, 
 
サイコロ風 05
2, 1, 2, 4, 1, 1, 4, 4, 3, 2, 
 
100分率 099
32, 31, 40, 4, 55, 70, 97, 33, 15, 81, 
 
半端な範囲 2099
38, 61, 70, 66, 34, 73, 66, 59, 30, 68, 
 
4番の駒を動かします
7番の駒を動かします
18番の駒を動かします
 
20%の確率で発生するイベントです。
!!!!!!!!!!!!!!!!!!!!!!
100回中22回イベントが発生しました。
 
3%の確率で発生するイベントです。
!!!!!!
100回中6回イベントが発生しました。
 

ideone サンプルをコピペできたりして便利です

タグ:

C言語 乱数
最終更新:2012年09月23日 23:44
添付ファイル