最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++生成隨機數(shù)的實現(xiàn)代碼

 更新時間:2020年04月19日 09:14:05   作者:jerry_fuyi  
這篇文章主要介紹了C++生成隨機數(shù)的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C風(fēng)格

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

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

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

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

#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++風(fēng)格

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

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

標準規(guī)定了3種隨機數(shù)引擎:

  • 線性同余l(xiāng)inear_congruential_engine(LCG),時間空間消耗都少;
  • 梅森旋轉(zhuǎn)mersenne_twister_engine(MT),占用較多內(nèi)存(在PC上可以忽略),計算量較大;
  • 帶進位減法(屬于滯后斐波那契生成器,LFG)subtract_with_carry_engine,性能與效果折中。

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

引擎適配器可以套一個隨機數(shù)引擎:

  • discard_block_engine在連續(xù)若干個偽隨機數(shù)中選擇若干個;
  • independent_bits_engine把位數(shù)多的偽隨機數(shù)壓縮成位數(shù)少的;
  • shuffle_order_engine把連續(xù)若干個偽隨機數(shù)重排。

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

隨機數(shù)引擎的模板參數(shù)怎么???標準定義了一些數(shù)學(xué)家們發(fā)現(xiàn)的效果良好的隨機數(shù)引擎:LCG minstd_rand0、minstd_rand、knuth_b;MT mt19937、mt19937_64;LFG ranlux24_base、ranlux48_base、ranlux24、ranlux48。如果你還是無從下手,那就用default_random_engine,編譯器的開發(fā)者們?yōu)槟氵x好了他們認為最合適的,在MSVC中是mt19937,在GCC中是minstd_rand0。

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

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

#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;
}

大多數(shù)情況下我們不需要min到max范圍的整數(shù),而需要一定分布的整數(shù)或?qū)崝?shù)。標準規(guī)定了許多隨機數(shù)分布類型,我數(shù)學(xué)不好,不太懂這些。

  • 均勻分布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;
  • 正態(tài)分布normal_distribution、lognormal_distribution、chi_squared_distribution、cauchy_distribution、fisher_f_distribution、student_t_distribution;

抽樣分布discrete_distribution、piecewise_constant_distribution、piecewise_linear_distribution。

構(gòu)造分布實例時傳入分布的參數(shù)。調(diào)用operator()獲得結(jié)果,參數(shù)為隨機數(shù)引擎。

#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中左閉右開的習(xí)慣不同,uniform_int_distribution構(gòu)造函數(shù)接受的參數(shù)是閉區(qū)間。

到此這篇關(guān)于C++生成隨機數(shù)的實現(xiàn)代碼的文章就介紹到這了,更多相關(guān)C++生成隨機數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語言實現(xiàn)字符串逆序操作案例

    使用C語言實現(xiàn)字符串逆序操作案例

    這篇文章主要介紹了使用C語言實現(xiàn)字符串逆序操作案例,本文包含使用C語言的兩種方法去實現(xiàn),遞歸和非遞歸,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++?opencv實現(xiàn)在圖片上畫一條線示例代碼

    C++?opencv實現(xiàn)在圖片上畫一條線示例代碼

    這篇文章主要為大家介紹了C++?opencv實現(xiàn)在圖片上畫一條線的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • VSCode搭建STM32開發(fā)環(huán)境的實現(xiàn)步驟

    VSCode搭建STM32開發(fā)環(huán)境的實現(xiàn)步驟

    因為VSCode免費且好用,可以安裝各種插件,本文主要介紹了VSCode搭建STM32開發(fā)環(huán)境的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 合并排序(C語言實現(xiàn))

    合并排序(C語言實現(xiàn))

    遞歸算法是把一個問題分解成和自身相似的子問題,然后再調(diào)用自身把相應(yīng)的子問題解決掉。這些算法用到了分治思想。
    2013-02-02
  • c++實現(xiàn)簡單的線程池

    c++實現(xiàn)簡單的線程池

    本文介紹的線程池采用C++語言,在windows平臺下實現(xiàn)。本著技術(shù)分享的精神寫作本文同時公布源代碼。歡迎大家指出該線程池存在的問題并對當前性能進行討論。
    2015-03-03
  • C/C++ 中memset() 函數(shù)詳解及其作用介紹

    C/C++ 中memset() 函數(shù)詳解及其作用介紹

    這篇文章主要介紹了C/C++ 中memset() 函數(shù)詳解及其作用介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 使用Matlab繪制七夕咕呱小青蛙

    使用Matlab繪制七夕咕呱小青蛙

    七夕節(jié)到了還不快給你的朋友安排上這只咕呱小青蛙?本文將用Matlab繪制一個可愛的咕呱小青蛙,感興趣的小伙伴可以動手嘗試一下
    2022-08-08
  • c語言 字符串轉(zhuǎn)大寫的簡單實例

    c語言 字符串轉(zhuǎn)大寫的簡單實例

    這篇文章主要介紹了c語言 字符串轉(zhuǎn)大寫的簡單實例,有需要的朋友可以參考一下
    2013-12-12
  • C++實現(xiàn)LeetCode(129.求根到葉節(jié)點數(shù)字之和)

    C++實現(xiàn)LeetCode(129.求根到葉節(jié)點數(shù)字之和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(129.求根到葉節(jié)點數(shù)字之和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言數(shù)據(jù)的存儲詳解

    C語言數(shù)據(jù)的存儲詳解

    本文詳細講解了C語言數(shù)據(jù)的存儲,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12

最新評論

遂平县| 庆元县| 灯塔市| 夏河县| 三明市| 青神县| 报价| 金华市| 岚皋县| 扶余县| 贵溪市| 赤水市| 绵阳市| 邵阳市| 临沭县| 齐齐哈尔市| 丹阳市| 通城县| 昆山市| 襄汾县| 兰西县| 正宁县| 嵩明县| 浮梁县| 龙海市| 柳林县| 潼南县| 广昌县| 新和县| 云浮市| 闵行区| 古蔺县| 安国市| 泰宁县| 江北区| 乐陵市| 宜良县| 游戏| 浠水县| 宁强县| 五大连池市|