在實際編程中,我們經(jīng)常需要生成隨機數(shù)。在c語言中我們通常使用rand方法生成隨機數(shù),在調(diào)用rand前需要調(diào)用srand初始化隨機數(shù)種子。
貴陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
電腦:華為MateBook14
系統(tǒng):Windows10
軟件:notepad++等編輯器、gcc編譯器1.0
1、使用rand函數(shù)生成隨機數(shù),rand隨機生成一個位于0 ~ RAND_MAX之間的整數(shù)。如下圖中,我們直接使用rand方法生成10個隨機數(shù)。
2、程序運行后生成了隨機數(shù),但直接使用rand的問題在于,在下次程序調(diào)用時,生成的隨機數(shù)與上次一致。所以,rand函數(shù)雖然生成隨機數(shù),但可以說是一個偽隨機。因為每次調(diào)用時,生成數(shù)字順序都是固定的。
3、為了在每次調(diào)用時生成不同的隨機數(shù),使用srand函數(shù)初始化隨機數(shù)種子。只要隨機數(shù)種子變化了,那么生成的隨機數(shù)就會改變。通常,srand使用當前時間作為種子。
4、但使用時間作為隨機數(shù)種子是否安全呢?我們目前程序執(zhí)行的速度都太快了,一秒鐘對于計算機來說太漫長了。我們將生成隨機數(shù)的操作定義為函數(shù),然后調(diào)用函數(shù)兩次,看生成的隨機數(shù)仍然時一樣。
5、優(yōu)化函數(shù)也比較簡單,在使用時間的基礎上,我們還加上一個定增序號。這樣能保證就算同一秒鐘內(nèi)多次調(diào)用,隨機數(shù)的種子都是不一樣的。
6、通常,我們需要獲取一定范圍內(nèi)的隨機數(shù)。所以,在生成隨機數(shù)之后我們使用模運算獲取對應范圍內(nèi)的數(shù)據(jù)。如生成0到100內(nèi)的隨機數(shù)。
源程序代碼以及算法解釋如下:
產(chǎn)生1-10隨機數(shù)程序:
#include iostream
#include time.h
using namespace std;
int main()
{
const int n = 10;//定義隨機數(shù)個數(shù)
int number[n] = { NULL };//定義隨機數(shù)存儲的數(shù)組
srand((unsigned)time(NULL));//初始化隨機函數(shù)
number[0] = rand() % n;//第一個隨機數(shù)無需比較
cout number[0] " ";
for (int i = 1; i n; i++)//其余隨機數(shù)循環(huán)產(chǎn)生
{
int j = 0;
number[i] = rand() % n;//產(chǎn)生隨機數(shù)
while (1)
{
if (number[i] == number[j])//若有相同則繼續(xù)循環(huán)重新安排隨機數(shù)
{
number[i] = rand() % n;//產(chǎn)生隨機數(shù)
j = 0;//若遇到相同的就從頭遍歷
continue;
}
if (j == (i - 1))//若遍歷完就跳出
break;
j++;
}
cout number[i] " ";
}
cout endl;
return 0;
}
程序運行結(jié)果如下:
擴展資料:
利用vector進行隨機數(shù)輸出:
#include iostream
#include vector
#include time.h
using namespace std;
int main()
{
const int n = 10;
int randnum;
vectorint number;
for (int i = 0; i n; i++)
{
number.push_back(i + 1);????//從尾部添加元素
cout number[i] " ";
}
cout endl;
srand((unsigned)time(NULL));
for (int j = 0; j n; j++)?????//其余隨機數(shù)循環(huán)產(chǎn)生
{
randnum = rand() % (n - j);????//rand函數(shù)生成的隨機數(shù)是0-(n-1)
cout number.at(randnum) " ";
number.erase(number.begin() + randnum);
}
cout endl;
return 0;
}
c語言中產(chǎn)生隨機數(shù)的相關函數(shù)主要包括srand和rand函數(shù),兩者配合生成隨機數(shù)據(jù),測試代碼如下,
#includestdio.h
#include stdlib.h
#include time.h
void main()
{
int i=0,j=0;
int p[5][5]={0};
srand(time(NULL));
for(i=0;i5;i++)
for(j=0;j5;j++)
p[i][j]=rand()%100+1;//產(chǎn)生1-100的隨機數(shù)存入數(shù)組p中
printf("二維數(shù)組p為:\n");
for(i=0;i5;i++)
{
for(j=0;j5;j++)
printf("%d\t",p[i][j]);
printf("\n");
}
}
一般srand和rand配合使用產(chǎn)生偽隨機數(shù)序列。rand函數(shù)在產(chǎn)生隨機數(shù)前,需要系統(tǒng)提供的生成偽隨機數(shù)序列的種子,rand根據(jù)這個種子的值產(chǎn)生一系列隨機數(shù)。如果系統(tǒng)提供的種子沒有變化,每次調(diào)用rand函數(shù)生成的偽隨機數(shù)序列都是一樣的。srand(unsigned seed)通過參數(shù)seed改變系統(tǒng)提供的種子值,從而可以使得每次調(diào)用rand函數(shù)生成的偽隨機數(shù)序列不同,從而實現(xiàn)真正意義上的“隨機”。通??梢岳孟到y(tǒng)時間來改變系統(tǒng)的種子值,即srand(time(NULL)),可以為rand函數(shù)提供不同的種子值,進而產(chǎn)生不同的隨機數(shù)序列。
c語言隨機數(shù)函數(shù)是 rand()
若要輸出1~10之間的隨機數(shù),
可用rand()%10+1。