c語言偽隨機數
⑴ c語言中rand()%m是啥意思
rand()%m這個函數是隨機產生0到m-1的隨機數;比如rand()%10就是隨機產生0到9的隨機數。
拓展資料
使用C語言的rand函數,生成的是偽隨機數;
c語言之rand函數的使用
1、寫入頭文件
生成隨機數rand函數的用法:
函數rand()是真正的隨機數生成器,而srand()會設置供rand()使用的隨機數種子。如果你在第一次調用rand()之前沒有調用srand(),那麼系統會為你自動調用srand()。而使用同種子相同的數調用 srand()會導致相同的隨機數序列被生成。
srand((unsigned)time(NULL))則使用系統定時/計數器的值做為隨機種子。每個種子對應一組根據演算法預先生成的隨機數,所以,在相同的平台環境下,不同時間產生的隨機數會是不同的,相應的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則無論何時運行、運行多少次得到的「隨機數」都會是一組固定的序列,因此srand生成的隨機數是偽隨機數。
⑵ C語言怎樣產生一定范圍的隨機數
在C語言中,rand()函數可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數,可以稱它為種子。
為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數。
C語言產生一定范圍的隨機數的源代碼如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
for(i=0; i<10; i++) //隨機產生10個數。
{
printf("%d ", rand());
}
return 0;
}
(2)c語言偽隨機數擴展閱讀
1、如果要隨機生成一個在一定范圍的數,你可以在宏定義中定義一個random(int number)函數,然後在main()裡面直接調用random()函數。
2、在對rand()的前三次調用中,並且此後得到的返回值仍然是在對rand()的第一批調用中所得到的其餘的返回值。因此,只有再次給srand()提供一個隨機的「種子」值,才能再次得到一個隨機數。
⑶ C語言編程中生成隨機數的初級教程
幾個概念
隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。
隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。所以要產生隨機數,則srand(seed)的隨機數種子必須也要隨機的。
用srand()產生隨機數種子
原型:void srand ( unsigned int seed );
作用是設置好隨機數種子,為了讓隨機數種子是隨機的,通常用time(NULL)的值來當seed。
time()用於隨機數種子
函數原型:time_t time ( time_t * timer );
time()函數表示返回1970-1-1 00:00:00 到當前時間的秒數。
用的時候這樣:srand(unsigned(time(NULL)));例如產生1~10之間的隨機整數
#include#includeint main(){ srand(time(NULL)); for(int i=0;i < 10;i++) { int randValue=rand()%10; }}
上面的程序中要注意srand是在for循環外面的,如果把srand放到for循環裡面,則每次產生的隨機數都相同。
用rand()產生隨機數
原型:int rand ( void );
作用是產生一個隨機數,當然隨機數是有范圍的,為0~RAND_MAX之間,隨機數與隨機數種子有關。具體來說是,在產生隨機數 rand()被調用的時候,它會這樣執行:
如果用戶之前調用過 srand(seed)的話,他會重新調用一遍 srand(seed)以產生隨機數種子;
如果發現沒有調用過 srand(seed)的話,會自動調用 srand(1)一次。
如果調用srand(seed)產生的隨機數種子是一樣的.話(即seed的值相同),rand()產生的隨機數也相同。
所以,如果希望rand()每次調用產生的值都不一樣,就需要每次調用srand(seed)一次,而且seed不能相同。這里就是經常採用time(NULL)產生隨機數種子的原因。
C語言中可以使用rand()函數來生成一個從0到RAND_MAX的uniform分布。基於這個函數,我們可以構造出一些特定的隨機數生成器來滿足我們的需求。
(一)0到1的uniform分布:
//generate a random number in the range of [0,1]double uniform_zero_to_one(){ return (double)rand()/RAND_MAX;}
(二)任意實數區間的uniform分布:
//generate a random real number in [start,end]double uniform_real(double start,double end){ double rate=(double)rand()/RAND_MAX; return start+(end-start)*rate;}
(三)任意整數區間的uniform分布:
//generate a random integer number in [start,end)int uniform_integer(int start,int end){ int base=rand(); if(base==RAND_MAX) return uniform_integer(start,end); int range=end-start; int remainder=RAND_MAX%range; int bucket=RAND_MAX/range; if(base<RAND_MAX-remainder) return start+base/bucket; else return uniform_integer(start,end);}
這個函數要特別說明一下,平常時候我們都是用rand()%n來生成0到n-1的隨機數,但是按這種方法生成的分布並不是uniform的,另外由於RAND_MAX只有32767,因此要生成比這個數更大的隨機數需要另外想辦法,理論上可以直接用0到1的uniform分布直接放縮,但實際效果不好。這里給出一種移位方式的實現。
(四)32bits的隨機數
//generate a random 32 bits integer number int rand32(){ return ((rand()<<16)+(rand()<<1)+rand()%2);}
有了32bits的隨機數生成方法,就可以構造32bits范圍內的隨機整數區間了,方法和之前16bits的情況一樣。
(五)32bits范圍內的隨機整數區間
//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){ int base=rand32(); if(base==RAND32_MAX) return uniform_integer_32(start,end); int range=end-start; int remainder=RAND32_MAX%range; int bucket=RAND32_MAX/range; if(base<RAND32_MAX-remainder) return start+base/bucket; else return uniform_integer_32(start,end);}
這里RAND32_MAX定義為0x7fffffff。
除此之外,利用rand()函數構造任意分布的隨機數也是個值得探討的問題。
理論上可以通過(0,1)的uniform分布,加上標准采樣方法(sampling)獲得。
⑷ 淺析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
⑸ c語言中rand()函數怎麼用
rand函數功能為獲取一個偽隨機數(偽隨機數的概念下面會有介紹)。
一、函數名:
rand();
二、聲明:
int rand();
三、所在頭文件:
stdlib.h
四、功能:
返回一個偽隨機數。之所以說是偽隨機數,是因為在沒有其它操作下,每次執行同一個程序,調用rand得到的隨機數序列是固定的(不是真正的「隨機」)。
五、為了使rand的結果更「真」一些,也就是令其返回值更具有隨機性(不確定性),C語言在stdlib.h中還提供了srand函數,通過該函數可以設置一個隨機數種子,一般用當前時間的毫秒數來做參數。通過time(NULL)可以獲取到當前時間的毫秒值(該函數位於time.h)中。
六、使用rand的流程可以總結為:
1 調用srand(time(NULL))設置隨機數種子。
2 調用rand函數獲取一個或一系列隨機數。
需要注意的是,srand只需要在所有rand調用前,被調用一次即可,沒必要調用多次。
七、以下是隨機獲取10個整型值並輸出的例子,輔助理解。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
inti;
srand(time(NULL));//設置隨機數種子。
for(i=0;i<10;i++)//運行10次。
printf("%d ",rand());//每次獲取一個隨機數並輸出。
return0;
}