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