アットウィキロゴ

解説

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;
}
 

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

無加工 0~32767
19571, 11130, 6519, 27779, 25295, 15893, 3947, 24267, 29651, 29063, 
 
サイコロ風 0~5
2, 1, 2, 4, 1, 1, 4, 4, 3, 2, 
 
100分率 0~99
32, 31, 40, 4, 55, 70, 97, 33, 15, 81, 
 
半端な範囲 20~99
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
添付ファイル