日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++中的偽隨機數_C 語言

作者:舒泱 ? 更新時間: 2022-09-13 編程語言

真隨機數

自然界中的有很多不確定的物理現象,通過測量這些現象,就可以獲得真隨機數。

比如白噪聲的幅值、電子元器件的電壓噪聲等,真隨機數可以通過用硬件對這些參數進行采集獲得。

偽隨機數

偽隨機數序列是用確定性的算法計算出來的周期很長的序列。

程序的運行過程是一個確定的過程,每一條指令都是確定的,因此不能產生真的隨機數。? ? ? ?

說到偽隨機數就會說到種子,什么是種子呢,我們可以將種子理解為一個初始值,特定算法根據這個初始值產生一個一定的序列,生成的這個序列“看起來”是隨機的,實際上是一個周期很長的確定序列。

如果每次的種子設置得相同,那么產生的序列都是相同的。? ? ? ?

舉個例子

我們可以簡單的設置這個種子為某個數,比如1。

請看如下代碼,用srand()設置種子的值,用rand()產生偽隨機數序列,需要包含頭文件#include <stdlib.h>。重復運行下列代碼,因為種子相同,所以每次輸出的序列都是如圖的序列"41 18467 6334 26500 …"。

srand(1);   // 設置種子的值為1,如果不設置,默認種子為1
for (int i = 0; i < 10; ++i) {
    cout << rand() << " ";	// 輸出10個偽隨機數
}

如果每次種子設置得不同,那生成的序列也將不同。 如何獲得不同的種子呢?? ? ? ?

可以用C語言中的庫函數 time_t time(time_t *seconds) 返回自1970-01-01 00:00:00 UTC 起經過的時間,以秒為單位。

這個函數的入參seconds也能保存結果,請看如下代碼,輸出的t和seconds的值是一樣的。

    time_t seconds;
    time_t t=time(&seconds);
    cout << t <<" "<< seconds <<endl;  // t和seconds的值是一樣的

那么,我們將當前的時間設置為種子,由于時間一直在變,種子就一直在變,每次就能生成不同的偽隨機數序列。

time_t t=time(nullptr);
srand(t);   // 設置種子的值為時間
for (int i = 0; i < 10; ++i) {
    cout << rand() << " ";
}

C++代碼示例

題目

將1-100的有序序列變成無序序列,要求每次運行的結果不同。

// 題目:將1-100的有序序列變成無序序列,要求每次運行的結果不同。
void fun(vector<int> &vec) {
    time_t t = time(nullptr);
    srand(t);   // 設置種子的值為時間
    rand();
    for (int i = 0; i < 500; ++i) {
        // 每次隨機交換數組中的兩位
        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");
}

原文鏈接:https://blog.csdn.net/weixin_43222324/article/details/108631034

欄目分類
最近更新