C++ で乱数を生み出す

プログラミング C++

何通りかやり方があるので、その一部を紹介します。

最初に抑えておきたい基本的な使い方や、プログラムするソフトのインストールなどの初期設定などについてまだご覧になっていない方はこちらをご覧ください。

線形合同法を利用した乱数の生成

実際のプログラム画面

#include <iostream>

class Random {
public:
    Random(unsigned int x0, unsigned int mm, unsigned int aa = 1103515245, unsigned int cc = 12345) {
        x = x0; //開始値
        m = mm; //法
        a = aa; //乗数
        c = cc; //増分
    }

    unsigned int getNext() {
        unsigned int r = (a * x + c) % (1 << 31); //線形合同法で乱数を求める
        x = r; //次の計算のために保存しておく
        return r % m; //呼び出し元に求めた乱数を返す
    }

public:
    unsigned int x; //前回求めた乱数
    unsigned int m; //法
    unsigned int a; //乗数
    unsigned int c; //増分
};

int main()
{
    Random random(1, 255);
    for (int i = 1; i <= 10; i++) {
        int v = random.getNext();
        std::cout << v << "\n";
    }
}

これを実行すると下記のようになる。

45
45
34
136
214
9
242
0
206
187

C:\Users\test.exe (プロセス 18356) は、コード 0 で終了しました。
デバッグが停止したときに自動的にコンソールを閉じるには、[ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自 動的にコンソールを閉じる] を有効にします。
このウィンドウを閉じるには、任意のキーを押してください…

プログラムの解説

int main()
{
    Random random(1, 255);
    for (int i = 1; i <= 10; i++) {
        int v = random.getNext();
        std::cout << v << "\n";
    }
}

Random関数を呼び出し、1から255の範囲で乱数を生成する

C++の関数を利用した乱数

実際のプログラム画面

int main(void) {
    printf("RAND_MAX: %d\n", RAND_MAX);

    printf("\n"); //改行する

    // 0から2147483647までの乱数を3つ生成
    for (int i = 0; i < 3; i++) {
        printf("%d\n", rand());
    }

    printf("\n"); //改行する

    // 1から10までの乱数を3つ生成
    // 生成された数字の下1桁を抽出することで表示する
    for (int i = 0; i < 3; i++) {
        printf("%d\n", rand() % 10 + 1);
    }

    return 0;
}

御覧の通り、「rand()」関数を使うことで乱数を表示することができる

プログラムの解説

7行目 printf(“RAND_MAX: %d\n”, RAND_MAX);

で、文字列に続けて乱数の最大値を算出して表示している

13行目 printf(“%d\n”, rand());

で、乱数を0から最大値(今回は32767)までの中から算出して表示している

21行目 printf(“%d\n”, rand() % 10 + 1);

で、1~10までの中から乱数を算出して表示している

また、21行目最後のほうにある +1 を削除すれば0~9の乱数を算出できる

コメント

タイトルとURLをコピーしました