日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言如何给随机数赋变量,C语言产生随机数序列的方法

發(fā)布時間:2024/1/1 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言如何给随机数赋变量,C语言产生随机数序列的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、隨機數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。