rand C 隨機函式

2021-10-21 00:25:46 字數 2005 閱讀 9841

過完年啦,我又回來啦~ 嗚嗚嗚不想上班,這個月居然什麼節假日都沒有嗚嗚嗚……感覺常用的資料結構總結得差不多了,今天來單獨寫一下隨機函式。

二、srand()設定種子

總結關於隨機函式有意思的是,計算機的隨機並不是我們傳統意義上理解的隨機。比如你讓我說乙個100以內的隨機數,那我可能會說「12」,因為這是個我喜歡的數字,你說「再來乙個」,我可能又會說「59」,為什麼呢?我就是隨口一說,這就叫隨機嘛。

但是計算機不同,你對它說「產生乙個100以內的隨機數」,它返回乙個值「84」,你再執行一次,它又返回「84」,執行100次,它還是返回84。為什麼呢?因為計算機又沒有自己喜歡的數字,它不會隨口一說,它只是運算乙個隨機函式,所謂函式,當自變數不變,計算結果一定不變,這是函式的基本性質之一。那麼如何讓計算機產生真正的隨機數呢?

首先,random函式不是ansi c標準,不能在gcc,vc等編譯器下編譯通過,所以我們用c++下的rand函式來實現。rand()的預設範圍是0-2147483647,如果我們需要特定範圍的隨機數,那麼就要對rand()的結果做一點小手腳。

//產生乙個1-100範圍內的隨機數

int n =

rand()

%100+1

;

將結果對100取模,得到的範圍就縮小到了0-99,再加1,就得到了我們要的1-100的範圍,同理我們可以通過不同的方法處理結果,來得到不同要求的隨機數。

//產生10個1-100範圍內的隨機數

for(

int i=

0;i<

10;i++

) cout<<

rand()

%100+1

<<

",";

//結果:84,87,78,16,94,36,87,93,50,22,

在這裡有的朋友可能會產生一點小問題(沒錯這個朋友就是我自己),我們稍後再討論。

在前言裡提到的「執行100次,它還是返回84」,是怎麼回事呢?畢竟計算機只是乙個忠實的執行者,rand()函式產生的結果並不是「隨口一說」,而是根據乙個值,我們稱之為種子(seed),對它進行一系列#¥%@*&^$操作得到的,也就是說產生的「隨機數」本質還是乙個計算結果,如果「種子」不變,計算結果也一定是固定的。

關於種子的預設值,有說預設值為1的,也有說每次計算機啟動後會有乙個預設值的。預設值為1好像是對的,重啟我沒試,畢竟工作用的電腦不到我離職是不能關機的哈哈哈哈哈(bushi)

通常我們用time(0)來設定種子,時間函式time(null)會返回從2023年1月1日至今所經歷的時間(以秒為單位),也就是說只要不在同一秒內執行,種子就不同,執行結果也就不同了。注意:使用time函式要加標頭檔案#include

srand

(time

(null))

;//設定隨機數種子,time的引數不重要

for(

int i=

0;i<

10;i++

) cout<<

rand()

%100+1

<<

",";

//結果:33,38,47,40,69,85,95,24,19,27,

哎那麼問題來了,剛才我沒設定種子的時候,連續產生的10個隨機數怎麼是不同的呢?不知道有沒有人跟我有同樣的疑問,反正這個問題我翻了好多講rand()函式用法的部落格都沒找到答案,最後還是看了實現原理才明白。

在連續呼叫rand()函式的時候,第乙個數來自「種子」(如果沒有設定就是預設種子),而從第二個數開始,不再使用原來的種子,而是把前乙個生成的隨機數作為新的種子。比如第乙個隨機數是由預設種子「1」生成的84,那麼在計算第二個隨機數的時候,種子就變成了「84」,以此類推。所以在同一次執行中,產生的隨機數是不同的。

我自己試了一下,好像也不是直接用上乙個隨機數作為種子,可能還要做什麼處理,那我就不知道了……總之是用已生成的隨機數序列修改種子。

隨機函式本質還是由公式生成的,或許某一天人工智慧會發展到計算機可以「隨口一說」乙個隨機數嗎?那就距離真正的智慧型不遠了吧。

隨機函式rand c

一 c 中不能使用random 函式 random 函式不是ansi c標準,不能在gcc,vc等編譯器下編譯通過。但在c語言中int random num 可以這樣使用,它返回的是0至num 1的乙個隨機數。可改用c 下的rand函式來實現。1 c 標準函式庫提供一隨機數生成器rand,返回0 r...

隨機函式rand c

一 c 中不能使用random 函式 random函式不是ansi c標準,不能在gcc,vc等編譯器下編譯通過。但在 c語言中int random num 可以這樣使用 它返回的是0至num 1的乙個隨機數。可改用c 下的 rand 函式來實現。1 c 標準函式庫提供一隨機數生成器rand,返回0...

隨機函式rand c

rand 的用法 rand 不需要引數,它會返回乙個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的乙個大整數。maximum value returned by rand function define rand max 0x7fffu 這個是bcc55中的定義,說明這個整數的最大數是0x...