馬紅旭
【摘要】 文章討論的問(wèn)題是利用c語(yǔ)言中的隨機(jī)整數(shù),編寫(xiě)幾個(gè)有用的程序。
【關(guān)鍵詞】 C語(yǔ)言 隨機(jī)整數(shù) 程序
C語(yǔ)言中隨機(jī)函數(shù)RAND( )的功能是產(chǎn)生0—32767之間的隨機(jī)整數(shù)。根據(jù)隨機(jī)函數(shù)取值范圍,我們可以變換出幾個(gè)有用的數(shù)學(xué)公式,以它們做為數(shù)學(xué)模型,就能夠編寫(xiě)幾個(gè)有用的程序,本文將研究利用c語(yǔ)言中的隨機(jī)整數(shù),編寫(xiě)幾個(gè)有用程序的方法和過(guò)程。
一、驗(yàn)證隨機(jī)函數(shù)取值范圍
有資料顯示C語(yǔ)言中隨機(jī)函數(shù)RAND( )的取值范圍是-90—32767之間的隨機(jī)整數(shù),和我們上面提到的0—32767之間的隨機(jī)整數(shù)有一定差距,到底哪個(gè)正確,我們不妨親自編寫(xiě)程序驗(yàn)證。思路是:產(chǎn)生n個(gè)隨機(jī)整數(shù), 每當(dāng)這個(gè)隨機(jī)整數(shù)值小于0時(shí),我們把計(jì)算器次數(shù)x增加一次,程序最后打印x的值。我們可以根據(jù)打印出的x值,做出相應(yīng)的判斷,如果x值大于0次,說(shuō)明rand( )函數(shù)有取[-0,-90]之間負(fù)整數(shù)的可能。據(jù)此我們編寫(xiě)c語(yǔ)言程序,代碼如下:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main()
{ long int n=0,x=0;
srand( (unsigned)time( NULL ) );
for(n=1;n<=100000;n++)
if (rand()<0)x=x+1;
printf("%d", x ); }
經(jīng)多次運(yùn)行,甚至n最大值取到2G驗(yàn)證,x值始終為零,說(shuō)明rand()函數(shù)不可能取負(fù)值,因此驗(yàn)證得到結(jié)論:隨機(jī)函數(shù)RAND( )的取值范圍是0—32767之間的隨機(jī)整數(shù)。
二、利用隨機(jī)函數(shù)產(chǎn)生指定位數(shù)的隨機(jī)整數(shù)
利用RAND( )函數(shù)產(chǎn)生一位隨機(jī)整數(shù) (0—9),公式為rand( )%10,產(chǎn)生兩位隨機(jī)整數(shù) (10—99)
公式為rand( )%90+10,產(chǎn)生三位隨機(jī)整數(shù) (100—999)公式為rand( )%900+100,以此類(lèi)推產(chǎn)生n位隨機(jī)整數(shù)公式為 rand()%(int)( pow(10,n)-pow(10,n-1) )+(int)pow(10,n-1) ),據(jù)此我們可以編程序?qū)崿F(xiàn)產(chǎn)生n個(gè)n位的隨機(jī)整數(shù)(這里只產(chǎn)生10個(gè)數(shù))。代碼如下:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
int main()
{ long int i,n=0,x=0;
printf(“請(qǐng)輸入產(chǎn)生隨機(jī)整數(shù)的位數(shù)”);
scanf("%d",&n;);
srand( (unsigned)time( NULL ) );
for(i=1;i<=10;i++)
if (n==1)printf("%d,",rand()%10);
else printf("%d,",
rand()%(int)( pow(10,n)-pow(10,n-1) )
+(int)pow(10,n-1) ); }
三、利用隨機(jī)函數(shù)產(chǎn)生指定范圍的隨機(jī)整數(shù)
利用RAND( )函數(shù)產(chǎn)生指定[A,B]范圍的隨機(jī)整數(shù),公式為rand( )%(B-A+1)+A。依此公式我們編寫(xiě)了一個(gè)程序,功能是:出幾道加法題給小學(xué)生做,如果學(xué)生寫(xiě)對(duì)答案,顯示‘ok字樣,可以進(jìn)行下一道題;如果沒(méi)做對(duì),返回,重做此題。程序代碼如下:
#include “stdio.h”
#include “stdlib.h”
#include “math.h”
#include “time.h”
int main()
{ int i,n=0;int a,b,c;
printf(“請(qǐng)問(wèn)要做幾位數(shù)加法?”);
scanf("%d",&n;);
srand( (unsigned)time( NULL ) );
for(i=1;i<=10;i++)
{a=rand()%(int)( pow(10,n)-pow(10,n-1) ) +(int)pow(10,n-1) ;
b=rand()%(int)( pow(10,n)-pow(10,n-1) ) + (int)pow(10,n-1) ;
a1:printf("%d+%d=?",a,b);
scanf("%d",&c;);
if (a+b==c)printf("ok\n");
else goto a1;} }
當(dāng)然,程序還可有很多變化,比如學(xué)生可以預(yù)先選擇做幾道題,做完每道題退不退出等,此處不贅述。
四、綜述
利用上述方法,我們研究了C語(yǔ)言隨機(jī)整數(shù) rand( )幾種用法,運(yùn)算結(jié)果正確問(wèn)題得到解決,該方法省時(shí)省力,安全高效,對(duì)c語(yǔ)言的應(yīng)用與推廣意義重大。
參 考 文 獻(xiàn)
[1] 譚浩強(qiáng)等編著 .C程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2005(2007重?。?/p>
[2] 徐金梧等編著. TURBO C使用大全 [M]. 北京:北京科海培訓(xùn)中心,1989.
[3] Charles Wright等著.鄧勁生等譯 Visual c++程序員實(shí)用大全[M]. 北京:中國(guó)水利水電出版社,1989.