<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C++生成隨機數的實現代碼

    • 發布:C++培訓
    • 來源:C++資訊
    • 時間:2020-05-29 14:38

    C為隨機數提供的工具是rand、srand和RAND_MAX,定義在<stdlib.h>中。

    srand為rand設置種子,如果不設置,相當于調用過srand(1)。rand產生偽隨機數,其范圍為0到RAND_MAX,RAND_MAX至少是32767,在MSVC和GCC中這個值都是32767。

    偽隨機數看似隨機,實則是有規律可循的,對于相同的種子值,rand產生的序列完全相同,也就是說無論你給srand一個什么數字,多次運行程序的結果都將相同——除非你給srand的是不同的數字,比如時間。<time.h>中的time函數返回整數表示的系統時間,可用于設置種子。

    如果我們只需要0到9的隨機數,可以把rand的返回值% 10;如果是42到233,可以寫rand() % 192 + 42。下面的random函數封裝了這項工作。注意只有在b - a + 1遠小于或整除RAND_MAX時隨機數的分布才比較均勻。

    #include <stdio.h>

    #include <stdlib.h>

    #include <time.h>

    int random(int a, int b)

    {

    return rand() % (b - a + 1) + a;

    }

    int main()

    {

    srand(time(NULL));

    printf("RAND_MAX = %d\n", RAND_MAX);

    for (int i = 0; i < 10; i++)

    printf("%d ", rand());

    printf("\n");

    int count[10] = {0};

    for (int i = 0; i < 10000; i++)

    count[random(0, 9)]++;

    for (int i = 0; i < 10; i++)

    {

    printf("%d: ", i);

    for (int j = 0; j < count[i] / 10; j++)

    printf("*");

    printf("\n");

    }

    }

    C++風格

    從C++11開始,C++標準規定了隨機數設施,包括均勻隨機位生成器(Uniform random bit generators,URBG)和隨機數分布等,定義在<random>中。

    URBG分為隨機數引擎、引擎適配器、預置隨機數生成器和非確定隨機數生成器4類,通常后兩類就夠用了。

    標準規定了3種隨機數引擎:

    (1)線性同余linear_congruential_engine(LCG),時間空間消耗都少;

    (2)梅森旋轉mersenne_twister_engine(MT),占用較多內存(在PC上可以忽略),計算量較大;

    (3)帶進位減法(屬于滯后斐波那契生成器,LFG)subtract_with_carry_engine,性能與效果折中。

    隨機數引擎都需要一個種子,生成的都是偽隨機數。

    引擎適配器可以套一個隨機數引擎:

    discard_block_engine在連續若干個偽隨機數中選擇若干個;

    independent_bits_engine把位數多的偽隨機數壓縮成位數少的;

    shuffle_order_engine把連續若干個偽隨機數重排。

    套娃的方式是模板,理論上你還可以用適配器套適配器,不過CPU可能會有意見。

    隨機數引擎的模板參數怎么取?標準定義了一些數學家們發現的效果良好的隨機數引擎:LCG minstd_rand0、minstd_rand、knuth_b;MT mt19937、mt19937_64;LFG ranlux24_base、ranlux48_base、ranlux24、ranlux48。如果你還是無從下手,那就用default_random_engine,編譯器的開發者們為你選好了他們認為最合適的,在MSVC中是mt19937,在GCC中是minstd_rand0。

    以上工具都生成偽隨機數,標準還定義了真·隨機數引擎random_device,盡管標準也允許它是偽隨機的。如果它是真隨機的,那么使用起來它的效果無疑是最好的,但是多次調用后性能會急劇下降,通常只用于生成偽隨機數引擎的種子。

    隨機數生成器類型都定義了靜態方法min和max,返回生成的隨機數的范圍,以及無參數的函數調用運算符operator(),返回隨機數。

    #include <iostream>

    #include <random>

    int main()

    {

    auto engine = std::default_random_engine(std::random_device()());

    std::cout << "min = " << engine.min() << "; max = " << engine.max() << std::endl;

    std::cout << "random numbers: ";

    for (int i = 0; i != 10; ++i)

    std::cout << engine() << ' ';

    std::cout << std::endl;

    }

    大多數情況下我們不需要min到max范圍的整數,而需要一定分布的整數或實數。標準規定了許多隨機數分布類型,我數學不好,不太懂這些。

    均勻分布uniform_int_distribution、uniform_real_distribution;

    伯努利分布bernoulli_distribution、binomial_distribution、negative_binomial_distribution、geometric_distribution;

    泊松分布poisson_distribution、exponential_distribution、gamma_distribution、weibull_distribution、extreme_value_distribution;

    正態分布normal_distribution、lognormal_distribution、chi_squared_distribution、cauchy_distribution、fisher_f_distribution、student_t_distribution;

    抽樣分布discrete_distribution、piecewise_constant_distribution、piecewise_linear_distribution。

    構造分布實例時傳入分布的參數。調用operator()獲得結果,參數為隨機數引擎。

    #include <iostream>

    #include <random>

    #include <string>

    int main()

    {

    auto engine = std::default_random_engine(std::random_device()());

    std::uniform_int_distribution<int> uniform(0, 9);

    int count[10] = {0};

    for (int i = 0; i != 10000; ++i)

    ++count[uniform(engine)];

    for (int i = 0; i != 10; ++i)

    std::cout << i << ": " << std::string(count[i] / 10, '*') << std::endl;

    }

    注意,與STL中左閉右開的習慣不同,uniform_int_distribution構造函數接受的參數是閉區間。

    當你還在擔心能否就業時,達內學員提前被企業錄取;當你轉輾于各大招聘會時,達內學員收到了高薪offer;當你在各大招聘網站投遞簡歷時,達內學員中有人一畢業進入五百強名企。所以選擇很重要。找C++培訓班,選達內就對了。

    版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:使用C語言如何實現隨機發牌?
    下一篇:C++遞歸實現螺旋數組的實例代碼

    C語言宏定義的幾種使用方法

    C與C++內存管理避坑指南

    C/C++代碼規范注釋有哪些講究?

    C語言中,全局變量濫用的后果竟如此嚴重?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>