生成隨機數


 C語言中生成隨機數的方法:

#include <time.h>
#include <stdlib.h>

int main()
{
    srand(time(NULL)); //為rand函數提供種子
    printf("%d\n", rand() % 10); //輸出一個隨機數,范圍為0-9
    printf("%d\n", rand() % 10 + 1); //輸出一個隨機數,范圍為1-10

    return 0;
}

  C++11中生成隨機數需要隨機數引擎類default_random_engine,包含頭文件<random>:

#include <random>

default_random_engine e; //隨機數引擎類
for (size_t i = 0; i < 5; ++i)
    cout << e() << ", "; //生成原始隨機數,輸出為3499211612, 581869302, 3890346734, 3586334585, 545404204

 指定生成的隨機數區間需要隨機數分布類uniform_int_distribution:

void RandPrint() { default_random_engine e; uniform_int_distribution<unsigned> u(0, 100); //隨機數分布類,生成的隨機數在0-100之間

    for (size_t i = 0; i < 10; ++i) cout << u(e) << endl; //將u作為隨機數源,生成10個隨機數
}

 上面的RandPrint()如果兩次調用的話會發現生成的隨機數是相同的,要每次調用RandPrint生成不同的隨機數需要引擎和分布對象保持狀態,因此可以將他們定義為static來實現:

void RandPrint() { static default_random_engine e; static uniform_int_distribution<unsigned> u(0, 100); //隨機數分布類,生成的隨機數在0-100之間

    for (size_t i = 0; i < 10; ++i) cout << u(e) << endl; //將u作為隨機數源,生成10個隨機數
}

 上面的函數每次運行程序都會生成相同的隨機數,如果每次運行程序都要生成不同的隨機數需要提供一個“種子”。“種子”就是一個數值,可以在引擎對象創建的時候提供種子,也可以調用引擎的seed()成員來設置種子:

#include "stdafx.h" #include <Windows.h> #include <iostream> #include <ctime> #include <random>
using std::default_random_engine; using std::uniform_int_distribution; using std::cout; using std::endl; void RandPrint(long long llSeeds) { static default_random_engine e; e.seed(llSeeds); static uniform_int_distribution<unsigned> u(0, 100); //隨機數分布類,生成的隨機數在0-100之間

    for (size_t i = 0; i < 10; ++i) cout << u(e) << ", "; //將u作為隨機數源
} int main() { RandPrint(100); RandPrint(100); //上面兩次生成的隨機數相同,因為種子相同
 RandPrint(time(0)); Sleep(2000); RandPrint(time(0)); //上面兩次生成的隨機數相同,因為種子不同

    return 0; }

 生成浮點類型的隨機數,使用uniform_real_distribution:

void RandPrint(long long llSeeds) { static default_random_engine e; e.seed(llSeeds); static uniform_real_distribution<double> u(0, 1); //隨機數分布類,生成的隨機數在0-1之間

    for (size_t i = 0; i < 10; ++i) cout << u(e) << ", "; //將u作為隨機數源
} int main() { RandPrint(time(0)); return 0; }

 以上的uniform_int_distribution、uniform_real_distribution隨機數分布對象都是均勻分布,我們還可以使用非均勻分布的隨機數分布對象來生成非均勻隨機數,如伯努利分布bernoulli_distribution、、正態分布normal_distribution等:

 default_random_engine e; bernoulli_distribution b(0.5); //以50%的概率生成true
    for (size_t i = 0; i < 10; ++i) cout << b(e) << ", "; //輸出為1, 0, 0, 1, 1, 0, 1, 0, 0, 0

 隨機數分布類還有一個成員函數reset(),它重建隨機數分布對象的狀態,使隨后對該對象的使用不依賴於它已經生成的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM