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

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

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

C風格

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

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

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

如果我們只需要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++標準規(guī)定了隨機數設施,包括均勻隨機位生成器(Uniform random bit generators,URBG)和隨機數分布等,定義在<random>中。

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

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

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

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

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

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

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

隨機數引擎的模板參數怎么???標準定義了一些數學家們發(fā)現的效果良好的隨機數引擎: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。

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

隨機數生成器類型都定義了靜態(tài)方法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范圍的整數,而需要一定分布的整數或實數。標準規(guī)定了許多隨機數分布類型,我數學不好,不太懂這些。

  • 均勻分布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。

構造分布實例時傳入分布的參數。調用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構造函數接受的參數是閉區(qū)間。

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

相關文章

  • 使用C語言實現字符串逆序操作案例

    使用C語言實現字符串逆序操作案例

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

    C++?opencv實現在圖片上畫一條線示例代碼

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

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

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

    合并排序(C語言實現)

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

    c++實現簡單的線程池

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

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

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

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

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

    c語言 字符串轉大寫的簡單實例

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

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

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

    C語言數據的存儲詳解

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

最新評論

任丘市| 二连浩特市| 张家港市| 奉化市| 金湖县| 禄丰县| 探索| 盐津县| 禹州市| 根河市| 中阳县| 武隆县| 固镇县| 昌都县| 镇平县| 罗田县| 延庆县| 汾西县| 磐安县| 天柱县| 湾仔区| 西城区| 东平县| 嘉黎县| 大埔区| 乃东县| 东山县| 尖扎县| 明星| 二手房| 紫阳县| 观塘区| 韩城市| 郴州市| 南乐县| 福海县| 开远市| 蕉岭县| 漳州市| 福贡县| 稷山县|