C++產(chǎn)生隨機(jī)數(shù)的幾種方法小結(jié)
使用cstdlib庫(kù)
C++11之前,C和C++都用相同的方法來(lái)產(chǎn)生隨機(jī)數(shù)(偽隨機(jī)數(shù)),即rand()函數(shù),用法如下:
1)使用srand()撒一個(gè)種子
功能:初始化隨機(jī)數(shù)發(fā)生器
用法:void srand(unsigned int seed)
2)使用rand()產(chǎn)生隨機(jī)數(shù)
功能:隨機(jī)數(shù)發(fā)生器
用法:int rand(void)
3)控制隨機(jī)數(shù)范圍
要取得 [a,b) 的隨機(jī)整數(shù),使用 (rand() % (b-a))+ a;
要取得 [a,b] 的隨機(jī)整數(shù),使用 (rand() % (b-a+1))+ a;
要取得 (a,b] 的隨機(jī)整數(shù),使用 (rand() % (b-a))+ a + 1;
** 參考:C++ rand 與 srand 的用法
4)示例代碼
#include <iostream>
#include <ctime>
#include <cstdlib>
int getRand(int min, int max);
int main() {
srand(time(0));
for (int i=0; i<10; i++) {
int r = getRand(2,20);
std::cout << r << std::endl;
}
return 0;
}
// 左閉右閉區(qū)間
int getRand(int min, int max) {
return ( rand() % (max - min + 1) ) + min ;
}使用random庫(kù):c++11 random library
C++11之前,無(wú)論是C,還是C++都使用相同方式的來(lái)生成隨機(jī)數(shù),而在C++11中提供了隨機(jī)數(shù)庫(kù),包括隨機(jī)數(shù)引擎類、隨機(jī)數(shù)分布類,簡(jiǎn)介如下:
隨機(jī)數(shù)引擎類
一般使用 default_random_engine 類,產(chǎn)生隨機(jī)非負(fù)數(shù)(不推薦直接使用)
直接使用時(shí):
#include <iostream>
#include <ctime>
#include <random>
int main() {
std::default_random_engine e;
e.seed(time(0));
for (int i=0; i<10; i++) {
std::cout << e() << std::endl;
}
return 0;
}輸出結(jié)果:
16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709
隨機(jī)數(shù)分布類
uniform_int_distribution:產(chǎn)生均勻分布的整數(shù)
示例代碼:
#include <iostream>
#include <ctime>
#include <random>
int main() {
std::default_random_engine e;
std::uniform_int_distribution<int> u(2,20); // 左閉右閉區(qū)間
e.seed(time(0));
for (int i=0; i<10; i++) {
std::cout << u(e) << std::endl;
}
return 0;
}輸出結(jié)果:
4
5
16
17
15
17
6
10
13
13
uniform_real_distribution:產(chǎn)生均勻分布的實(shí)數(shù)
#include <iostream>
#include <ctime>
#include <random>
int main() {
std::default_random_engine e;
std::uniform_real_distribution<double> u(1.5,19.5); // 左閉右閉區(qū)間
e.seed(time(0));
for (int i=0; i<10; i++) {
std::cout << u(e) << std::endl;
}
return 0;
}輸出結(jié)果:
11.9673
2.29179
9.82668
9.82764
10.2394
13.8324
2.95336
9.72177
16.5145
12.1421
normal_distribution:產(chǎn)生正態(tài)分布的實(shí)數(shù)
示例代碼:
#include <iostream>
#include <ctime>
#include <random>
int main() {
std::default_random_engine e;
std::normal_distribution<double> u(0,1); // 均值為0,標(biāo)準(zhǔn)差為1
e.seed(time(0));
for (int i=0; i<10; i++) {
std::cout << u(e) << std::endl;
}
return 0;
}輸出結(jié)果:
0.390995
-0.680137
-1.02953
-0.53243
0.375886
-0.19804
-0.796159
0.837714
0.899632
2.06609
bernoulli_distribution:生成二項(xiàng)分布的布爾值
#include <iostream>
#include <ctime>
#include <random>
int main() {
std::default_random_engine e;
std::bernoulli_distribution u(0.8); // 生成1的概率為0.8
e.seed(time(0));
for (int i=0; i<10; i++) {
std::cout << u(e) << std::endl;
}
return 0;
}輸出結(jié)果:
1
0
1
1
1
1
1
1
1
1
參考:C++11新特性(75)-隨機(jī)數(shù)庫(kù)(Random Number Library)
到此這篇關(guān)于C++產(chǎn)生隨機(jī)數(shù)的幾種方法小結(jié)的文章就介紹到這了,更多相關(guān)C++產(chǎn)生隨機(jī)數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)
這篇文章主要介紹了一文詳解C++子類函數(shù)為什么不能重載父類函數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享
這篇文章主要介紹了C++中可正確獲取UTF-8字符長(zhǎng)度的函數(shù)分享,需要的朋友可以參考下2014-08-08
C++實(shí)現(xiàn) vector 的四則運(yùn)算
本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下2016-07-07
C++程序自動(dòng)重啟的實(shí)現(xiàn)代碼
自動(dòng)重啟原理很簡(jiǎn)單,用一個(gè)進(jìn)程監(jiān)控另一個(gè)進(jìn)程,掛了就再啟動(dòng)一個(gè),細(xì)節(jié)也不算多,主要是正確判斷進(jìn)程狀態(tài)和啟動(dòng)方式,本文就給大家講講C++程序自動(dòng)重啟的實(shí)現(xiàn)方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-04-04
C++實(shí)現(xiàn)LeetCode(125.驗(yàn)證回文字符串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(驗(yàn)證回文字符串).本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
對(duì)C++ string append方法的常用用法詳解
今天小編就為大家分享一篇對(duì)C++ string append方法的常用用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-06-06
C++實(shí)現(xiàn)LeetCode(237.刪除鏈表的節(jié)點(diǎn))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(237.刪除鏈表的節(jié)點(diǎn)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++?通過pqxxlib庫(kù)鏈接?PostgreSql數(shù)據(jù)庫(kù)的詳細(xì)過程
這篇文章主要介紹了C++?通過pqxxlib庫(kù)鏈接?PostgreSql數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04

