當前位置:首頁 » 編程語言 » c語言偽隨機

c語言偽隨機

發布時間: 2023-06-17 01:55:24

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;
}

運行樣例如下:

熱點內容
xp編程器功能介紹 發布:2025-02-12 12:37:00 瀏覽:973
海康威視監控密碼是多少位 發布:2025-02-12 12:20:29 瀏覽:584
安卓的自帶瀏覽器在哪裡 發布:2025-02-12 12:20:29 瀏覽:722
望海潮上傳 發布:2025-02-12 12:16:08 瀏覽:672
javathread源碼 發布:2025-02-12 12:12:37 瀏覽:907
整個伺服器搭建教程 發布:2025-02-12 11:48:16 瀏覽:579
我的世界伺服器人多的 發布:2025-02-12 11:48:12 瀏覽:347
為實現分頁存儲管理需要哪些硬體支持 發布:2025-02-12 11:46:34 瀏覽:539
編程下載線 發布:2025-02-12 11:41:48 瀏覽:210
json存儲數據 發布:2025-02-12 11:41:39 瀏覽:219