マルチスレッド版数独自動生成ソフト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話へ

本講義トップへ