マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第4章 if文(もしもボックス))
第2話 ランダムデータの生成とif文による判定
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
using namespace std;//coutを使うときに必要なお呪い
int main() {//私は社長だ。
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
この基本データに次の赤のコードを加えてください。
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
using namespace std;//coutを使うときに必要なお呪い
void ランダムデータの生成と判定();//0以上100以下の整数データを生成して合否判定をする。
int main() {//私は社長だ。
ランダムデータの生成と判定();
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
void ランダムデータの生成と判定() {
//0以上100以下の整数データを生成して合否判定をする。
int テスト結果 = rand() % 101;//rand()とは0以上32767の整数をランダムに発生させる関数です。
//そしてrand() % 101とはその整数を101で割ったときの余りを求める式です。
cout << テスト結果;
if(テスト結果 >= 50)cout << ":合格" << endl;
if (テスト結果 < 50)cout << ":不合格" << endl;
}
さて、F5を押すと

(
41:不合格
)
判定は確かに正しいです。
ところが、コンソール画面で×で閉じてもう一度F5を押しても

(
41:不合格
)
と全く同じです。
rand()とは0以上32767の整数をランダムに発生させる関数です。
ただし、実際にはコンピュータは本当の乱数を発生させることはできませんから、
模擬乱数です。
そして、注釈文に書いてあるように
A % 整数 はAを整数で割った余りを求める式です。
例えば、
17 % 5 = 2
というわけです。
商と余りは整数を扱うときの2大要素です。
17 / 5 = 3
です。
int a;
int b;
のとき a / b はaもbも整数型と定義されているので、
小数点以下は自動的に捨てられて整数値になるのです。
魔方陣自動生成では商と余りを使いまくります。
商と余りに分解して魔方陣を生成したことが
私の魔方陣の研究の始まりだったのです。
そこで、コード少し修正して
void ランダムデータの生成と判定() {
//0以上100以下の整数データを生成して合否判定をする。
for (int i = 0; i < 10; i++) {
int テスト結果 = rand() % 101;//0以上100以下の整数データを生成する。
cout << テスト結果;
if (テスト結果 >= 50)cout << ":合格" << endl;
if (テスト結果 < 50)cout << ":不合格" << endl;
}
}
(コピペしてください)
としてF5を押してください。

(
41:不合格
67:合格
34:不合格
0:不合格
69:合格
24:不合格
78:合格
58:合格
62:合格
64:合格
)
一応合否判定の形は整いましたが、
×でコンソール画面を閉じて、
もう一度F5を押しても

(
41:不合格
67:合格
34:不合格
0:不合格
69:合格
24:不合格
78:合格
58:合格
62:合格
64:合格
)
と全く同じです。
模擬乱数といっても発生する順番は同じです。
そこで、さらに修正を加えます。
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
void ランダムデータの生成と判定();//0以上100以下の整数データを生成して合否判定をする。
int main() {//私は社長だ。
ランダムデータの生成と判定();
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
void ランダムデータの生成と判定() {
//0以上100以下の整数データを生成して合否判定をする。
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++) {
int テスト結果 = rand() % 100;//0以上100以下の整数データを生成する。
cout << テスト結果;
if (テスト結果 >= 50)cout << ":合格" << endl;
if (テスト結果 < 50)cout << ":不合格" << endl;
}
}
とします。
F5を押すと、

(
85:合格
31:不合格
83:合格
3:不合格
33:不合格
45:不合格
84:合格
72:合格
75:合格
55:合格
)
×押してF5をする度に

(
70:合格
59:合格
35:不合格
58:合格
37:不合格
79:合格
6:不合格
1:不合格
30:不合格
79:合格
)
と毎回変わります。
当然皆さんの画面は異なります。
srand((unsigned)time(NULL));
とは何でしょうか。
そして、なぜ毎回異なるようになったのでしょうか。
謎を残したまま第2話を終了します。
謎の答えを知りたい方は第3話へをクリックしてください。
ただし、第3話は2026年2月4日にアップします。
第4章第1話へ 第4章第3話へ
本講義トップへ