C语言如何给随机数赋变量,C语言产生随机数序列的方法
一、隨機數(shù)序列的產(chǎn)生
在軟件測試、游戲等應(yīng)用場合,經(jīng)常需要用到隨機數(shù)序列。在C語言中,隨機數(shù)可以用rand()函數(shù)來產(chǎn)生。每次調(diào)用rand()函數(shù),總會返回一個隨機整數(shù)值,范圍在0~RAND_MAX之間。對于int類型,RAND_MAX的值為32767。
程序中引用rand()函數(shù)時,必須在程序的開頭使用#include 語句,把stdlib.h頭文件包含在內(nèi)。
#include
#include
void main( void )
{
int
i;
for( i=0; i<10; i++ )
printf(" %d", rand());
printf("\n");
}
程序運行以后,在屏幕上將顯示出10個看上去沒有明顯規(guī)律性的整數(shù)。當(dāng)這個序列數(shù)很大的時候,基本上能夠呈現(xiàn)正態(tài)分布的特征,我們可以把它當(dāng)成一個隨機數(shù)序列來使用。
但是,當(dāng)我們重復(fù)執(zhí)行這個程序時,仔細觀察可以發(fā)現(xiàn),每次執(zhí)行程序產(chǎn)生的數(shù)字序列是完全相同的,如下圖所示。這是怎么回事呢?
原來,這個所謂的隨機數(shù)序列實際上是以某個稱為種子的數(shù)為基礎(chǔ),根據(jù)某個復(fù)雜的公式推算出來的,只能稱為偽隨機數(shù)字序列。
當(dāng)計算機正常開機后,這個種子的值是預(yù)定了的,默認為1,所以在一臺計算機的一次開機之后產(chǎn)生的默認偽隨機序列總是相同的。
在C語言中,還可以利用隨機函數(shù)random()產(chǎn)生偽隨機數(shù)序列,但random()函數(shù)不是ANSI
C標(biāo)準(zhǔn),random函數(shù)不能在gcc,vc等編譯器下編譯通過。
二、如何產(chǎn)生不可預(yù)見的隨機數(shù)序列
要想產(chǎn)生不可預(yù)見的隨機數(shù)序列,關(guān)鍵在于如何使rand()獲得每次不同的種子數(shù)。什么樣的數(shù)是永遠不會重復(fù)的?那當(dāng)然是時間啦,每一次運行計算機的時間是永遠不相同的。
C語言還提供了一個產(chǎn)生隨機種子數(shù)的函數(shù)srand(),將它與rand()函數(shù)相配合,就能達到這個目的。
程序中使用這二個函數(shù)的工作過程如下:
(1)首先給srand()提供一個種子,它是一個unsigned
int類型,其取值范圍從0~65535;
(2)然后調(diào)用rand(),它會根據(jù)提供給srand()的種子值返回一個隨機數(shù)(在0到32767之間)
(3)根據(jù)需要多次調(diào)用rand(),從而不間斷地得到新的隨機數(shù);
(4)無論什么時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結(jié)果。
下面是產(chǎn)生10個取值范圍為0~32767之間的隨機數(shù)的程序:
#include
#include
#include
void main( void )
{
int i;
srand( (unsigned)time(NULL));
//初始化隨機數(shù)
for( i=0; i<10; i++ )
printf(" %d", rand());
printf("\n");
}
三、如何產(chǎn)生設(shè)定范圍內(nèi)的隨機數(shù)序列
rand()函數(shù)產(chǎn)生的隨機數(shù)取值范圍是0~rand_max(通常為0~32767),怎樣才能產(chǎn)生從X~Y的隨機數(shù)序列呢?
從X到Y(jié),有Y-X+1個數(shù),所以要產(chǎn)生從X到Y(jié)的數(shù),只需要這樣寫:
k=rand()%(Y-X+1)+X;
就可以產(chǎn)生從X到Y(jié)的隨機數(shù)序列了。
下面的程序可以產(chǎn)生2位正整數(shù)的隨機數(shù)序列
#include
#include
#include
void main( void )
{
int i;
srand( (unsigned)time(NULL));
for( i=0;
i<10;
i++ )
printf(" %d", rand()�+10);
printf("\n");
}
四、如何產(chǎn)生不重復(fù)的隨機數(shù)序列
(1)在具有100個元素的整型數(shù)組a中,將a[1]~a[99]賦予取值范圍為1~99的隨機數(shù),所有元素的值不得重復(fù)。
在聲明數(shù)組時,將所有元素的初值均賦為0,然后在每次for循環(huán)中隨機地生成一個1~99范圍內(nèi)的下標(biāo),并判斷該下標(biāo)所定義的元素值是否為0,若為0,說明這個元素是空的,則把當(dāng)前的循環(huán)控制變量i的值賦給它;若不為0,則說明這個元素已被賦值,于是在while循環(huán)中隨機地尋找下一個空元素。
雖然i的值是順序遞增的,但它賦給的數(shù)組元素下標(biāo)卻是隨機的,所以在保證了不重復(fù)的前提下,它的出現(xiàn)位置具有隨機性,所以滿足了題意要求。這種算法減少了大量的比較操作,時間和空間的效率都比較高。
#include
#include
#include
void main()
{
int i, m;
int a[100]={0};
// 聲明數(shù)組時將所有元素賦初值為0
srand((unsigned)time( NULL ));
for(i=1;
i<=99;
i++)
{
while(a[m=rand()0+1]);
// 隨機地尋找一個初值為0的元素
a[m] = i;
// 將不重復(fù)的i賦給這個元素
}
for(i=1;
i<=99;
++i)
{
printf("M", a[i] );
if(i==0 || i>=99) printf("\n");
}
}
(2)生成100個不重復(fù)的整數(shù),取值范圍為100~299,并保存在數(shù)組a中。
算法分析:
利用隨機函數(shù)rand()生成一個隨機數(shù)temp之后,將它與數(shù)組a中已賦值的m個元素依次比較,如果都不重復(fù),就把它作為一個新的元素添加到數(shù)組a中,作為已賦值元素的第m+1個元素。如果發(fā)現(xiàn)有重復(fù),則重新生成一個隨機數(shù),再與前m個元素進行比較。
隨著計算的進行,數(shù)組a中已賦值元素數(shù)m越大,需要進行比較的次數(shù)就越多,計算量也就越大。
#include
#include
#include
void main()
{
int i, m=0,temp,flag;
int a[100]={0};
srand((unsigned)time( NULL ));
while(m<100)
// 是否已生成100個不重復(fù)元素?
{
temp=rand() 0+100;
// 生成一個隨機數(shù)temp
flag=1;
// 假定temp與先前生成的所有數(shù)不重復(fù)
for(i=0; i<=m; i++)
// 將temp依次與先前生成的所有數(shù)比較
{
if(a[i]==temp)
// 若發(fā)現(xiàn)重復(fù),修改標(biāo)志,退出循環(huán)
{
flag=0;
break;
}
}
if(flag)
// 若確實與先前生成的所有數(shù)都不重復(fù)
{
a[m] = temp;
// 把這個數(shù)作為數(shù)組a的第m個元素
m++;
// 元素數(shù)加1
}
}
for(i=0; i<=99; i++)
{
printf("M", a[i] );
if((i+1)==0 || i>=99) printf("\n");
}
}
總結(jié)
以上是生活随笔為你收集整理的C语言如何给随机数赋变量,C语言产生随机数序列的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自学js第十五天:event坐标偏移量位
- 下一篇: 手机端变身为手柄杆,可以玩原来的游戏。坦