C++中的偽隨機(jī)數(shù)
真隨機(jī)數(shù)
自然界中的有很多不確定的物理現(xiàn)象,通過(guò)測(cè)量這些現(xiàn)象,就可以獲得真隨機(jī)數(shù)。
比如白噪聲的幅值、電子元器件的電壓噪聲等,真隨機(jī)數(shù)可以通過(guò)用硬件對(duì)這些參數(shù)進(jìn)行采集獲得。
偽隨機(jī)數(shù)
偽隨機(jī)數(shù)序列是用確定性的算法計(jì)算出來(lái)的周期很長(zhǎng)的序列。
程序的運(yùn)行過(guò)程是一個(gè)確定的過(guò)程,每一條指令都是確定的,因此不能產(chǎn)生真的隨機(jī)數(shù)。
說(shuō)到偽隨機(jī)數(shù)就會(huì)說(shuō)到種子,什么是種子呢,我們可以將種子理解為一個(gè)初始值,特定算法根據(jù)這個(gè)初始值產(chǎn)生一個(gè)一定的序列,生成的這個(gè)序列“看起來(lái)”是隨機(jī)的,實(shí)際上是一個(gè)周期很長(zhǎng)的確定序列。
如果每次的種子設(shè)置得相同,那么產(chǎn)生的序列都是相同的。
舉個(gè)例子
我們可以簡(jiǎn)單的設(shè)置這個(gè)種子為某個(gè)數(shù),比如1。
請(qǐng)看如下代碼,用srand()設(shè)置種子的值,用rand()產(chǎn)生偽隨機(jī)數(shù)序列,需要包含頭文件#include <stdlib.h>。重復(fù)運(yùn)行下列代碼,因?yàn)榉N子相同,所以每次輸出的序列都是如圖的序列"41 18467 6334 26500 …"。
srand(1); // 設(shè)置種子的值為1,如果不設(shè)置,默認(rèn)種子為1 for (int i = 0; i < 10; ++i) { cout << rand() << " "; // 輸出10個(gè)偽隨機(jī)數(shù) }
如果每次種子設(shè)置得不同,那生成的序列也將不同。 如何獲得不同的種子呢?
可以用C語(yǔ)言中的庫(kù)函數(shù) time_t time(time_t *seconds) 返回自1970-01-01 00:00:00 UTC 起經(jīng)過(guò)的時(shí)間,以秒為單位。
這個(gè)函數(shù)的入?yún)econds也能保存結(jié)果,請(qǐng)看如下代碼,輸出的t和seconds的值是一樣的。
time_t seconds; time_t t=time(&seconds); cout << t <<" "<< seconds <<endl; // t和seconds的值是一樣的
那么,我們將當(dāng)前的時(shí)間設(shè)置為種子,由于時(shí)間一直在變,種子就一直在變,每次就能生成不同的偽隨機(jī)數(shù)序列。
time_t t=time(nullptr); srand(t); // 設(shè)置種子的值為時(shí)間 for (int i = 0; i < 10; ++i) { cout << rand() << " "; }
C++代碼示例
題目
將1-100的有序序列變成無(wú)序序列,要求每次運(yùn)行的結(jié)果不同。
// 題目:將1-100的有序序列變成無(wú)序序列,要求每次運(yùn)行的結(jié)果不同。 void fun(vector<int> &vec) { time_t t = time(nullptr); srand(t); // 設(shè)置種子的值為時(shí)間 rand(); for (int i = 0; i < 500; ++i) { // 每次隨機(jī)交換數(shù)組中的兩位 swap(vec[rand() % 100], vec[rand() % 100]); } } int main() { vector<int> vec(100); for (int i = 0; i < 100; ++i) { vec[i] = i+1; } fun(vec); for (auto it : vec) { cout << it << " "; } cout << endl; system("pause"); }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C 語(yǔ)言二叉樹(shù)幾種遍歷方法詳解及實(shí)例
這篇文章主要介紹了C 語(yǔ)言二叉樹(shù)幾種遍歷方法詳解及實(shí)例的相關(guān)資料,二叉樹(shù)在數(shù)據(jù)結(jié)構(gòu)當(dāng)中是非常重要的知識(shí)要點(diǎn),這里對(duì)二叉樹(shù)進(jìn)行了總結(jié),需要的朋友可以參考下2017-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)不掛科指南之線(xiàn)性表詳解
線(xiàn)性表是由?n(n≥0)個(gè)數(shù)據(jù)元素組成的有窮序列,這篇文章主要來(lái)和大家來(lái)了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中的線(xiàn)性表,感興趣的小伙伴可以跟隨小編一起了解一下2022-09-09用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Visual Studio 2022中創(chuàng)建的C++項(xiàng)目無(wú)法使用萬(wàn)能頭<bits/stdc++.h>的
如果大家也遇到下面這種問(wèn)題,可能是沒(méi)有include文件夾中沒(méi)有bits/stdc++.h,這篇文章主要介紹了Visual Studio 2022中創(chuàng)建的C++項(xiàng)目無(wú)法使用萬(wàn)能頭<bits/stdc++.h>的解決方案,感興趣的朋友跟隨小編一起看看吧2024-02-02淺談C++為什么非要引入那幾種類(lèi)型轉(zhuǎn)換
這篇文章主要介紹了C++為什么非要引入那幾種類(lèi)型轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03基于Matlab實(shí)現(xiàn)水波倒影特效的制作
這篇文章主要介紹了如何利用Matlab制作出水波倒影的特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03C語(yǔ)言實(shí)現(xiàn)電子英漢詞典系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電子英漢詞典系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06