C++隨機數

C++隨機數

C中的做法

  • 之前都是使用rand()函數進行無符號隨機整數的生成,如果需要生成對應的範圍或者浮點數,需要自己進行一些修改,unsigned隨機數生成的方法如下所示。在使用中,爲了使得每次運行的結果都不一樣,我們將當前時間對應的無符號數作爲初始化的種子。
  • code

    void randOld()
    {
        // 按照時間來初始化種子,保證每次結果不一樣
        srand((int)time(0));
        for (int i = 0; i < 10; i++)
            cout << rand() << ", ";
        cout << endl;
    }
    

新標準的做法

  • 新標準中在頭文件<random>中引入了許多分佈類型,下面做一下簡要介紹。
  • random_device:非確定性隨機數生成設備,可以用於生成隨機初始化的種子,保證每次的運行結果都不一樣
  • default_random_engine:生成隨機無符號數
  • uniform_int_distribution:生成某個範圍內的均勻隨機分佈的數,模板類,包含提供參數的上下限。
  • uniform_real_distribution:均勻隨機分佈的實數分佈生成器
  • normal_distribution:正態分佈
  • 更多的可以參考:http://www.cplusplus.com/reference/random/
  • code

    void randNew()
    {
        random_device rd; // 非確定性隨機數生成設備
        default_random_engine e1; // 使用默認的初始化種子
        default_random_engine e2(rd()); // 不確定的數作爲初始化種子,每次運行結果都不一樣
        for (int i = 0; i < 10; ++i)
            cout << e1() << " ";
        cout << endl;
    
        for (int i = 0; i < 10; ++i)
            cout << e2() << " ";
        cout << endl;
    
        // 整數範圍
        uniform_int_distribution<> uid(-1, 1); // 包含上下限
        for (int i = 0; i < 10; i++)
            cout << uid(e2) << " ";
        cout << endl;
    
        // 實數範圍
        uniform_real_distribution<> udouble(-1, 0);
        for (int i = 0; i < 10; i++)
            cout << udouble(e2) << " ";
        cout << endl;
    
        normal_distribution<> normal(0, 2);
        for (int i = 0; i < 10; i++)
            cout << normal(e2) << " ";
        cout << endl;
    
        lognormal_distribution<double> lognormal(0, 1);
        for (int i = 0; i < 10; i++)
            cout << lognormal(e2) << " ";
        cout << endl;
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章