c語言偽隨機
1. C語言隨機函數
rand
和random都是偽隨機函數,一般直接讀取時間來做種子(sand(time))的也是不怎能隨機的
我給你一個我以前寫的,真正的隨機:
int
myrand(void)
{
int
seed
;
asm
("rdtsc"
:
"=A"
(seed))
;
srand((unsigned
int)seed);
return
rand();
}
2. 淺析C語言中的偽隨機數
哈嘍,大家好,我是北方素素~
首先給大家解釋一下這個標題,什麼叫做「淺析」呢?就是稍微分析一下,哈哈。用了「淺析」就突然感覺高大上了,其實並沒有多深奧,只是以鏈棗羨我的理解給大家解釋一下。
我們知道,在一些書籍中,使用C語言生成隨機數一般是這樣寫的:
srand(unsigned(time(NULL)));
int rand_number = rand();
這里主要涉及到了三個函數,srand(),rand()和time()。
不知道這三個函數是做什麼的?MSDN文檔中解釋了這三個函數的作用:
srand():Sets the starting seed value for the pseudorandom number generator(設置偽隨機數生成器的起始種子值)。
它的搭檔rand():Generates a pseudorandom number(生成一個偽隨機數)。
而time()的解釋就更簡單了:Get the system time(獲得系統時間)。
這三個函數組合在一起,就可以生成隨機數。
細心的同學可能會發現這里有一個特殊的詞-偽隨機數。那麼什麼是偽隨機數呢?
關於偽隨機數的概念我就不多說了,大家自行搜索一下就有很多解釋,在這里我只說一下自己的理解:
先說一下真隨機,真隨機也就是我們日常說的隨機,一個隨機事件的結果是不確定的,比如拋硬幣,在正常情況下,拋硬幣的結果是不確定的,換句話說,結果是不可預測的。
然後說說偽隨機,偽隨機是計算機生成隨機數的一種方式,計算機不能真正模仿隨機事件,而只能通過計算來生成隨機數。換句話說,如果我們知道了計算機計算隨機數的演算法,我們是可以預測偽隨機數的。
當然我們得用例子說話。
從上面的討論我們可以知道,因為rand()產生的數字是偽隨機數,所以它一定有一個固定的演算法來生成偽隨機數,那麼演算法是固定的,不固定的只有srand()所設置的種子了。
確定了這一點之後,我們就可以做實驗驗證我們的猜想了。
如果srand()設定的種子是一個固定值會發生什麼?
srand(1);
int rand_number = rand();
在我執行了N次之後,結果都是固定的。(大家可以親自試一試)
這就說明我們的「隨機數」就是通過某種演算法計算出來的結果,所以要想這個結果發生變化,就需要設定一個不斷變化的「種子」。
那麼這里也就解釋了「種子」的作用-用來給隨機數生成器提供一個輸入,之後隨機數生成器就會使用這個「種子」生成不同的偽隨機數。
舉個栗子~
如果我們的隨機數生成演算法是這樣的:
rand=1+x;
那麼我們的「種子」就是上式中的x,,每當我們輸入不同的x,產生的結果rand也就會不同。
至於為什麼選擇time()作為「種子」嘛,上面說了,這個函數呢,用來獲取系統時間,因為系統時間是一直在變化的,就相當於我們隨機數的「種子」是在一直變化的,所以每次調用time()函數,都會獲得不同的值,這樣我們的rand()每次生成的結果也就不一樣啦~
最後總結一下這三個函數在生成偽隨機數的時候是怎麼配合的。
首先,time()獲取了系統時間;然後,srand()把獲取到的系統時間設置為rand()的「種子」;最後,由rand()通過計算,把「種子」轉換為一個數字。
好啦,這篇文章就寫到這里了~
歡迎大家訪問我的網站:https://bfss.github.io/,如岩缺果覺得我的文章幫到了您,可以在網站上點擊「支持我」對我進行鼓勵喲~(手機端網頁在左上角棚拍,電腦端網頁在右上角)
https://www.bilibili.com/read/cv311534
出處: bilibili
3. C語言怎麼產生30-100的隨機數
利用C提供的偽隨機數產生函數rand實現。為了獲得「逼真隨機」效果,隨機數產生前應當用當前時間值調用庫函數srand來設定偽隨機數產生器的初始值(常稱下種子)。rand函數默認生成0~32767的隨機數,為達到題設30~100的要求,要將由rand生成的隨機數對71取模處理來獲得0~70的范圍,然後再+30便得到題解。代碼如下(以產生100個0~70的范圍隨機數為例):
#include"stdio.h"
#include"stdlib.h"//調用srand和rand需包含此文件
#include"time.h"//調用time需包含此文件
intmain(intargc,char*argv[]){
intn,l;
srand((unsigned)time(NULL));//調用庫函數sran為偽隨機產生器下種子
for(l=n=0;n<100;n++)
printf(++l%15?"%4d":"%4d ",rand()%71+30);//由rand()%71+30獲得30~100的范圍
if(l%15)
printf(" ");
return0;
}
運行樣例如下: