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