【C++】random随机数与【C++11】/rand()和srand()的用法
文章目錄
- 隨機(jī)數(shù)
- 1. c++ 11 random隨機(jī)數(shù)的使用(推薦使用)
- 1.1
- 1.2
- 1.3
- 1.4
- 2.1 C++中隨機(jī)函數(shù)rand()和srand()的用法(老本版)
- 2.2 限制隨機(jī)數(shù)的范圍
隨機(jī)數(shù)
C++ 提供了一組函數(shù)以生成和使用隨機(jī)數(shù)字。隨機(jī)數(shù)字就是從一組可能的值中進(jìn)行隨機(jī)選擇而獲得的一個(gè)值。該組中的值都有相同的被選中的幾率。
隨機(jī)數(shù)字常用于許多不同類型的程序中,以下是一些示例:
計(jì)算機(jī)游戲通常要使用隨機(jī)數(shù)字來(lái)模擬一些隨機(jī)過(guò)程,例如擲骰子或發(fā)牌。
模擬程序使用隨機(jī)數(shù)字來(lái)決定后續(xù)將要發(fā)生的一系列操作或人與動(dòng)物等的行為??梢詣?chuàng)建使用隨機(jī)數(shù)字的公式以確定特定事件在程序中出現(xiàn)的時(shí)間。
數(shù)據(jù)分析程序可能會(huì)使用隨機(jī)數(shù)字隨機(jī)選擇要檢驗(yàn)的數(shù)據(jù)。
計(jì)算機(jī)安全系統(tǒng)使用隨機(jī)數(shù)字來(lái)加密敏感數(shù)據(jù)。
我們知道,C 中的隨機(jī)數(shù)函數(shù)只有一個(gè) rand( ) ,想生成某一區(qū)間范圍內(nèi)的隨機(jī)數(shù)乃至隨機(jī)的浮點(diǎn)數(shù)都十分麻煩。
而 C++11 中提供的 random 庫(kù)解決了這一問(wèn)題,它能讓我們方便地生成需要的隨機(jī)值。
下面將介紹如何利用 random 庫(kù)中的組件生成符合條件的隨機(jī)數(shù)。
random 庫(kù)中的組件分為兩類——隨機(jī)數(shù)引擎類和隨機(jī)數(shù)分布類。
隨機(jī)數(shù)引擎類是可以獨(dú)立運(yùn)行的隨機(jī)數(shù)發(fā)生器,它以均勻的概率生成某一類型的隨機(jī)數(shù),但無(wú)法指定隨機(jī)數(shù)的范圍、概率等信息。因此,它也被稱為“原始隨機(jī)數(shù)發(fā)生器”,由于不能指定生成隨機(jī)數(shù)的范圍,它通常不會(huì)被單獨(dú)使用。
隨機(jī)數(shù)分布類是一個(gè)需要于隨機(jī)數(shù)引擎類的支持才能運(yùn)行的類,但是它能根據(jù)用戶的需求利用隨機(jī)數(shù)引擎生成符合條件的隨機(jī)數(shù),例如某一區(qū)間、某一分布概率的隨機(jī)數(shù)。
所有隨機(jī)數(shù)引擎類都支持的操作如下:
1. c++ 11 random隨機(jī)數(shù)的使用(推薦使用)
常用的隨機(jī)數(shù)類如下:
default_random_engine:隨機(jī)非負(fù)數(shù)(不建議單獨(dú)使用)。
uniform_int_distribution:指定范圍的隨機(jī)非負(fù)數(shù)。
uniform_real_distribution:指定范圍的隨機(jī)實(shí)數(shù)。
bernoulli_distribution:指定概率的隨機(jī)布爾值。
事實(shí)上,random 庫(kù)的功能極其豐富,其中的隨機(jī)數(shù)引擎不止有 default_random_engine 一個(gè),分布類也遠(yuǎn)遠(yuǎn)不止上述三個(gè)。它還能進(jìn)行泊松分布、正態(tài)分布、抽樣分等高級(jí)的隨機(jī)數(shù)功能,想詳細(xì)了解這些內(nèi)容請(qǐng)去查閱其他資料。我可能要等好久才能把這些內(nèi)容補(bǔ)上。
詳細(xì)參考:資料
1.1
1.2
1.3
1.4
2.1 C++中隨機(jī)函數(shù)rand()和srand()的用法(老本版)
C++ 庫(kù)有一個(gè)名為 rand() 的函數(shù),每次調(diào)用該函數(shù)都將返回一個(gè)非負(fù)整數(shù)。要使用 rand() 函數(shù),必須在程序中包含 頭文件。以下是其用法示例:
random_num = rand();
但是,該函數(shù)返回的數(shù)字其實(shí)是偽隨機(jī)數(shù)。這意味著它們具有隨機(jī)數(shù)的表現(xiàn)和屬性,但實(shí)際上并不是隨機(jī)的,它們實(shí)際上是用算法生成的。
該算法需要一個(gè)起始值,稱為種子,以生成數(shù)字。如果沒(méi)有給出一個(gè)種子,那么它將在每次運(yùn)行時(shí)產(chǎn)生相同的數(shù)字流。下面的程序說(shuō)明了這一點(diǎn):
#include <iostream>
#include <cstdlib>// Header file needed to use rand
using namespace std;
int main()
{// Generate and printthree random numberscout << rand() << " ";cout << rand() << " ";cout << rand() << endl ;return 0;
}
第1次運(yùn)行輸出結(jié)果:
41 18467 : 6334
第2次運(yùn)行輸出結(jié)果:
41 18467 6334
要在每次運(yùn)行程序時(shí)獲得不同的隨機(jī)數(shù)字流,則必須為隨機(jī)數(shù)生成器提供一個(gè)種子以開(kāi)始。在 C++ 中,這是通過(guò)調(diào)用 srand 函數(shù)完成的。
在 rand 被調(diào)用之前,srand 函數(shù)要先被調(diào)用,并且 srand 在整個(gè)程序中僅被調(diào)用一次。
#include <iostream>
#include <cstdlib> // Header file needed to use srand and rand
using namespace std;
int main()
{unsigned seed; // Random generator seed// Get a nseed" value from the usercout << "Enter a seed value: ";cin >> seed;// Set the random generator seed before calling rand()srand(seed);//Now generate and print three random numberscout << rand() << " ";cout << rand() << " ";cout << rand() << endl;return 0;
}
第1次運(yùn)行結(jié)果:
Enter a seed value: 19
100 15331 - 209
第2次運(yùn)行結(jié)果:
Enter a seed value: 171
597 10689 28587
從程序的輸出可以看出,每次程序使用不同的種子運(yùn)行時(shí),都會(huì)生成不同的隨機(jī)數(shù)字流。然而,如果再次使用 19 或 171 作為種子運(yùn)行程序,則將獲得與第一次完全相同的數(shù)字。
程序的第 12 行中,使用 cin 從用戶的輸入獲取隨機(jī)數(shù)生成器種子的值。實(shí)際上,獲取種子值的另一個(gè)常見(jiàn)做法是調(diào)用 time 函數(shù),它是 C++ 標(biāo)準(zhǔn)庫(kù)的一部分。
time 函數(shù)返回從 1970 年 1 月 1 日午夜開(kāi)始到現(xiàn)在逝去的秒數(shù),因此每次運(yùn)行程序時(shí),它都將提供不同的種子值。下面程序演示了 time 函數(shù)的用法。請(qǐng)注意,在調(diào)用它時(shí)必須給它傳遞一個(gè)參數(shù) 0。同時(shí)程序中包含一個(gè)新的頭文件 ctime,此頭文件是使用 time 函數(shù)所必需的。
time 函數(shù)返回從 1970 年 1 月 1 日午夜開(kāi)始到現(xiàn)在逝去的秒數(shù),因此每次運(yùn)行程序時(shí),它都將提供不同的種子值。下面程序演示了 time 函數(shù)的用法。請(qǐng)注意,在調(diào)用它時(shí)必須給它傳遞一個(gè)參數(shù) 0。同時(shí)程序中包含一個(gè)新的頭文件 ctime,此頭文件是使用 time 函數(shù)所必需的。
#include <iostream>
#include <cstdlib> // Header file needed to use srand and rand
#include <ctime> // Header file needed to use time
using namespace std;
int main()
{unsigned seed; // Random generator seed// Use the time function to get a "seed” value for srandseed = time(0);srand(seed);// Now generate and print three random numberscout << rand() << " " ;cout << rand() << " " ;cout << rand() << endl;return 0;
}
2.2 限制隨機(jī)數(shù)的范圍
有時(shí)程序需要一個(gè)特定范圍內(nèi)的隨機(jī)數(shù)。要將隨機(jī)數(shù)的范圍限制在 1 和某個(gè)最大值 max 之間的整數(shù),可以使用以下公式:
number = rand() % max + 1;
例如,要生成 1?6 的隨機(jī)數(shù)來(lái)代表骰子的點(diǎn)數(shù),則可以使用以下語(yǔ)句:
dice = rand() % 6 + 1;
總結(jié)
以上是生活随笔為你收集整理的【C++】random随机数与【C++11】/rand()和srand()的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 墙面漆现在一般多少钱一平方
- 下一篇: codecheck_use_record