本日のプログラミング放送(5/30)
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

本日のプログラミング放送(5/30)

2014-05-30 21:24
    本日も、昨日に引き続き乱数の勉強をしました。乱数には、rand()を使用する方法以外に、乱数ライブラリを使った方法、メルセンヌ・ツイスタについて学習しました。
    演習問題のソースコードを載せておきます。

    範囲指定乱数生成

    //演習2.ソースコードを、[1.0, 2.0] の範囲の
    //一様なdouble型乱数を20個表示するよう修正・ビルド・実行してみなさい。
    #include <random>
    #include <iostream>
    using namespace std;
    int main()
    {
       random_device rnd; // 非決定的な乱数生成器でシード生成機を生成
       mt19937 mt(rnd()); // メルセンヌツイスターの32ビット版、引数は初期シード
       uniform_real_distribution<> rand1(1.0, 2.0); // double型の[1.0, 2.0] 範囲の一様乱数 演習2
       for (int i = 0; i < 20; ++i) {
         cout << rand1(mt) << "\n";//演習2
       }
       getchar();
    return 0;
    }

    //演習3.ソースコードを、平均 0.0、分散 0.2 の
    //正規分布乱数を20個表示するように修正してみなさい。
    #include <random>
    #include <iostream>
    using namespace std;
    int main()
    {
       random_device rnd; // 非決定的な乱数生成器でシード生成機を生成
       mt19937 mt(rnd()); // メルセンヌツイスターの32ビット版、引数は初期シード
       normal_distribution<> norm(0.0, 2.0); // 平均0.0, 標準偏差2.0の正規分布 ばらつき
       for (int i = 0; i < 20; ++i) {
         cout << norm(mt) << "\n";
       }
       getchar();
    return 0;
    }

    //演習4. [0, 9999] の範囲の一様な整数乱数を100万回生成し、
    //0,1,2 と 9997, 9998, 9999 の値が出る回数がほぼ等しいことを確認しなさい。
    #include <random>
    #include <iostream>
    using namespace std;
    int main()
    {
       int cnt = 0;
       int cnt_m = 0;
       int x;
       random_device rnd; // 非決定的な乱数生成器でシード生成機を生成
       mt19937 mt(rnd()); // メルセンヌツイスターの32ビット版、引数は初期シード
       uniform_int_distribution<> rand1000(0, 9999); // [0, 9999] 範囲の一様乱数

       for (int i = 0; i < 1000000; ++i) {
       x = rand1000(mt);
          if(x >= 0 && x <= 2){
          cnt++;
          }else if(x >= 9997 && x <= 9999){
          cnt_m++;
       }
       }

       cout << "0から2の値が出る回数:" << cnt << '\n';
       cout << "9997から9999の値が出る回数:" << cnt_m << '\n';
       getchar();
       return 0;
    }

    //5. rand() と、本稿の両方の方法で [0, 99] の範囲の一様な乱数を100万回生成し、
    //平均を計算し、それらを比較してみなさい。
    //メルセンヌツイスターを使用したコード↓
    #include <random>
    #include <iostream>
    using namespace std;
    int main()
    {

       int goukei = 0;

       double heikin = 0;
       int x;
       random_device rnd; // 非決定的な乱数生成器でシード生成機を生成
       mt19937 mt(rnd()); // メルセンヌツイスターの32ビット版、引数は初期シード
       uniform_int_distribution<> rand1000(0, 99); // [0, 99] 範囲の一様乱数

       for (int i = 0; i < 1000000; ++i) {
         x = rand1000(mt);
         goukei += x;
       }
       heikin = goukei / 1000000.0;
       cout << "平均:" << heikin << '\n';

       getchar();
    return 0;
    }

    //5. rand() と、本稿の両方の方法で [0, 99] の範囲の一様な乱数を100万回生成し、
    //平均を計算し、それらを比較してみなさい。
    //rand()使用したコード↓


    #include<ctime>
    #include<cstdlib>
    #include <iostream>
    using namespace std;
    int main()
    {

       int goukei = 0;
       double heikin = 0;
       int x;
       srand(time(NULL));

       for (int i = 0; i < 1000000; ++i) {
         x = rand() % 100;
         goukei += x;

       }
       heikin = goukei / 1000000.0;
       cout << "rand()の平均:" << heikin << '\n';

       getchar();
       return 0;
    }

    //結果:100の範囲ではrandomとrandはほぼ同じとなった
    補足:randomライブラリはvisualstudio2010以降で使用できる新しいもの
    今回の成果:初めて、randomライブラリを勉強し正確な乱数で大変便利だと感じた。

    次回の課題:次回は何をしようかな。検討中

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。