#includestdio.h
創(chuàng)新互聯(lián)公司專注于新民網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供新民營銷型網(wǎng)站建設,新民網(wǎng)站制作、新民網(wǎng)頁設計、新民網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務,打造新民網(wǎng)絡公司原創(chuàng)品牌,更為您提供新民網(wǎng)站排名全網(wǎng)營銷落地服務。
#includestdlib.h //準備使用隨機生成函數(shù)
#includetime.h //為了給隨機函數(shù)指定每次不同的種子值,準備使用時間函數(shù)
#define N 100
void main() { int a[N],i;
srand((unsigned int)time(NULL)); //取當前時間當隨機數(shù)種子
for ( i=0;iN;i++ ) a[i]=rand()%100+1; //生成隨機數(shù)范圍在[1,100]區(qū)間
for ( i=0;iN;i++ ) printf("%d ",a[i]); printf("\n");
}
rand()函數(shù)生成隨機數(shù)區(qū)間為[0,65535]
如果要生成[a,b]之間的隨機數(shù):rand()%(b-a+1)+a
rand()%100生成隨機數(shù)范圍[0,99]
rand()%100+1生成[1,100]
srand(time(NULL));
是設置隨機種子,種子不同,每次運行時,生成的
隨機數(shù)
序列不同,種子相同,則得到的序列是相同的。
time(NULL)是獲得當前時間(以秒為單位),這樣,在不同的時間去運行程序,則會得到不同的
隨機序列
,這樣,每次得到的a
b
c是不相同的,如果不加這句,則每次都會得到相同的一組數(shù)據(jù)。
#include stdio.h
#include stdlib.h
#include time.h
#define N 10
main()
{
int i,a,b;
srand(time(0)); /*設置種子,并生成偽隨機序列*/
while(~scanf("%d",b))
{
for(i=0;iN;++i) rand()%10;
a = rand()%100;
while(1)
{
if(a == b) {puts(" 恭喜你 猜對了 !\n***************\n"); break;}
else if(a b) puts("你輸入的數(shù) 小了!");
else puts("你輸入的數(shù) 大了!");
scanf("%d",b);
}
}
system("pause");
}
vc6.0下運行:
#include stdio.h
#include stdlib.h
#include time.h
void main()
{
int a[101],b[101]={0},i,j,k=0,t=0;
srand(time(0));
for (i=0;i100;i++)
{
a[i] = rand()%90 + 10; //產(chǎn)生10~99的整數(shù)
if (a[i] % 2 == 0)
{
k++;
b[t++] = a[i];
}
}
printf("未排序時數(shù)組b的元素:\n");
for (t=0,i=0;ik;i++)
{
printf("%d ",b[i]);
t++;
if (t % 10 == 0)
printf("\n");
}
printf("\n\n");
//排序
for (i=0;ik-1;i++)
{
for (j=k-2;j=i;j--)
{
if (b[j] b[j+1])
{
t = b[j];
b[j] = b[j+1];
b[j+1] = t;
}
}
}
printf("排序后數(shù)組b的元素:\n");
for (t=0,i=0;ik;i++)
{
printf("%d ",b[i]);
t++;
if (t % 10 == 0)
printf("\n");
}
printf("\n");
}
你這樣做是以系統(tǒng)時間為種子,在不同的系統(tǒng)時間之內(nèi)會產(chǎn)生不同的隨機數(shù),同一時間當然一樣。并且把他縮短到100的范圍之內(nèi),就是說即使前后兩次產(chǎn)生的一個是1001,1999,他們也都顯示的結果一樣為10。程序本身運行的時間可算短之又短,所以這這么短的時間那產(chǎn)生的機會可認為種子一樣。你可以邊調(diào)試,邊看,兩次運行的是不一樣的。(調(diào)試時候執(zhí)行到那系統(tǒng)時間存在明顯差別)
在C語言中怎么產(chǎn)生隨機數(shù)呢?
rand()函數(shù)可以用來產(chǎn)生隨機數(shù),但是這不是真真意義上的隨機數(shù),是一個偽隨機數(shù)。這是根據(jù)一個數(shù),我們可以稱它為 種 了,為基準以某個遞推公式推算出來的一系數(shù),當這系列數(shù)很大的時候,就符合正態(tài)公布,從而相當于產(chǎn)生了隨機數(shù),但這不是真正的隨機數(shù)。當計算機正常開機后,這個種子的值是定了的(也就是說你將產(chǎn)生的隨機數(shù)已經(jīng)定了,每次運行都產(chǎn)生的是相同的隨機數(shù)),除非你破壞了系統(tǒng)。
為了改變這個種子的值,C提供了 srand()函數(shù),它的原形是void srand( int a)。
初始化隨機產(chǎn)生器既rand()函數(shù)的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函數(shù),我們是可以產(chǎn)生可以預見的隨機序列,那我們?nèi)绾尾拍墚a(chǎn)生不可預見的隨機序列呢?我們可能常常需要這樣的隨機序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的.
下面講一講在C語言里所提供的隨機數(shù)發(fā)生器的用法?,F(xiàn)在的C編譯器都提供了一個基于ANSI標準的偽隨機數(shù)發(fā)生器函數(shù),用來生成隨機數(shù)。它們就是rand()和srand()函數(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()的輸出結果。
以下是一個產(chǎn)生隨機數(shù)的例子:
需要首先使用隨機數(shù)“種子”初始化,srand函數(shù):
#i nclude stdlib.h
#i nclude stdio.h
#i nclude time.h//使用當前時鐘做種子
void main( void )
{
int i;
srand( (unsigned)time( NULL ) );//初始化隨機數(shù)
/* 打印10個隨機數(shù). */
for( i = 0; i 10;i++ )
printf( " %d\n", rand() );
}
在C語言中,是如何取得這個隨機數(shù)的?
一個語句:rand();
它的作用就是隨機取0到RAND_MAX之間的任何數(shù)。ANSI標準指出,RAND_MAX值的范圍到少是32767,也就是雙字節(jié)整數(shù)的最大值。 下面我們用一個例子來取得從1到6的隨機整數(shù):
#include stdio.h
#include stdlib.h
main()
{
int i;
for(i=1;i=20;i++)
printf("%10d",1+(rand()%6));
}
第2行的stdlib.h是rand()函數(shù)的頭文件。第7行就是 實現(xiàn)功能的語句了。前面我們以經(jīng)說過函數(shù)取的值是介于0到RANDMAX之間的,而我們所要的是1到6之間的整數(shù)。用腳想一想就知道:任一整數(shù)除以6所得的余數(shù)是0~5之間的整數(shù),再加一之后就是1到6了,也就是我們的目標。利用這個原理我們使用%號對隨機數(shù)進行了縮放。
OK,運行兩次程序:
一:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
二:6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1
發(fā)現(xiàn):兩次運行的結果完全一樣。
結論:這算什么隨機數(shù)。
這種重復性是rand的一個重要特點,在調(diào)試程序時,這種重復性是必不可少的,因為它可以證明對程序的修改能夠正常運行。
實際上,rand函數(shù)產(chǎn)生的是偽隨機數(shù)。但我們需要的是隨機數(shù)。于是,我們需要對程序進行隨機化,這需要使用標準庫函數(shù)srand來實現(xiàn)。函數(shù)srand需要一個無符號的整型參數(shù),在每次程序執(zhí)行時用函數(shù)rand去生在一組不同的隨機數(shù)。
所以另一個語句是:srand()再rand()
#include stdlib.h
#include stdio.h
main()
{
int i;
unsignde seed;
printf("Enter a seed:");
scanf("%u",seed);
srand(seed);
for( i = 1;i=20;i++)
printf(""%10d",1+(rand()%6));
}
程序的運行結果是當我們輸入不同的SEED時,產(chǎn)生不同組的隨機數(shù)。這句話的意思有兩個:一:當輸入相同的SEED時,產(chǎn)生的同組隨機數(shù);二:每次運行我們都要輸入一個SEED。
如果我們希望不用每次輸入SEED值,而且每次運行時SEED值都是不同的,我們可以用下面語句代替上面的第三塊的三個語句:
srand(time(NULL));
這會使計算機自動讀取自己的時鐘以獲得SEED值。于是我們就獲值了每次運行都會改變的SEED,同樣也就獲得了真正的隨機數(shù)
//記:rand()產(chǎn)生一個0~RAND_MAX之間的數(shù)(如0~32767,我試了幾次RAND_MAX最大只能為32767);
//rand()%n (n=32767) 就產(chǎn)生了一個0~n的數(shù)
//m+rand()%n(n=32767)就產(chǎn)生的是一個m~m+n的數(shù)。
//如果要產(chǎn)生4字節(jié)的int隨機數(shù),那要另尋方法:
//在網(wǎng)上找到一個:
// int N=0x7fffffff;
// cout(int)((double)rand() / (double)(RAND_MAX + 1) * N)"\n";
//但測試以后得 (0~0x7ffeffff)
//還有尋找中。。。