// 乱数を使ってみよう
// ポイント１．srand関数で乱数を初期化する
//     初期化しないと、毎回同じ乱数列を取得してしまいます。
// ポイント２．rand関数で擬似乱数を取得する
//     rand()関数の戻り値が擬似乱数なので、お好きなように
// ポイント３．余りを求める事で、乱数の範囲を自分の好みに調整できます
//     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;
	// ポイント１．srand関数で乱数を初期化する
	srand(time(NULL ));

	// ポイント２．rand関数で擬似乱数を取得する
	// 無加工 0～RAND_MAX
	printf("無加工 0～%d\n", RAND_MAX);
	for (i = 0; i < 10; i++) {
		r = rand();
		printf("%d, ", rand());
	}
	printf("\n\n");

	// ポイント３．余りを求める事で、乱数の範囲を自分の好みに調整できます
	//     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("半端な範囲 20～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;
}
