十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在C語(yǔ)言中使用rand函數(shù)生成10到20的隨機(jī)數(shù),需要包含stdlib.h頭文件,可以使用以下語(yǔ)句:
創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為永修等服務(wù)建站,永修等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為永修企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
x=rand()%(20-10+1)+10;
為了使用每次運(yùn)行都能得到不同的隨機(jī)數(shù)序列,還應(yīng)該在應(yīng)用此句代碼的前面,使用:
srand(time(0));語(yǔ)句(需包含time.h頭文件)。
程序是C++的,但是只要改下頭文件,本身是C語(yǔ)言的。
思路都在程序中,VS2010編譯通過,功能實(shí)現(xiàn)。
望采納~
#include "stdafx.h"
#include stdio.h
#include stdlib.h
#include string.h
#include time.h
#include math.h
int _tmain(int argc, _TCHAR* argv[])
{
int data[20];
int max[9];
int min[9];
// 生成20位隨機(jī)數(shù)
srand((unsigned int)(time(NULL)));
for(int i = 0; i=19; i++)
{
int _data;
do
{
_data = rand() % 10;
}
while(_data == 0 i==19);
// ↑防止最高位生成0
data[i] = _data;
}
printf("Data:");
for(int i = 19; i= 0; i--)
{
printf("%d",data[i]);
}
printf("\n");
// 取得最大數(shù)
int flag = 20;
int _max = 0;
for(int i = 8; i = 0; i--)
{
for(int j = flag-1; j = i; j-- )
{
if(data[j] _max)
{
_max = data[j];
flag = j;
}
}
max[i] = _max;
_max = 0;
}
/*
思路:最高位對(duì)一個(gè)數(shù)的大小影響最大,所以在選擇范圍內(nèi)選取最大的最高位,
選取范圍,最高位,也就是第9位,可以在原始數(shù)的第20-9位選擇,因?yàn)楸仨?/p>
留下8個(gè)數(shù),防止后面沒得選了,所以遞推第N位選擇范圍是從N-1選取的位置
前一位到第N位,例如第3個(gè)數(shù)選在了第9位,那么第四個(gè)數(shù)只能選在第8位到
第4位。
*/
printf("Max:");
for(int i = 8; i= 0; i--)
{
printf("%d",max[i]);
}
printf("\n");
// 取得最小數(shù)
flag = 20;
int _min = 9;
for(int i = 8; i = 0; i--)
{
for(int j = flag-1; j = i; j-- )
{
if((data[j] _min i != 8)||(data[j] _min data[j] != 0))
{
_min = data[j];
flag = j;
}
}
min[i] = _min;
_min = 9;
}
/*
思路:同取得最大數(shù),只不過要防止最高位取到0
*/
printf("Min:");
for(int i = 8; i= 0; i--)
{
printf("%d",min[i]);
}
printf("\n");
// 求差值,因?yàn)閿?shù)據(jù)9位數(shù),使用long
long lmax = 0,lmin = 0,diff = 0;
for(int i = 0; i=8; i++)
{
lmax += max[i] * pow((double)10, i);
lmin += min[i] * pow((double)10, i);
}
diff = lmax - lmin;
printf("Difference:%ld", diff);
printf("\n");
int _re;
scanf("%d",_re);
return 0;
}
#include stdio.h
#include stdlib.h
#include unistd.h
#include time.h
/*產(chǎn)生一個(gè)start~end區(qū)間中的隨機(jī)數(shù),然后返回該隨機(jī)值*/
int produce_rand(int start, int end);
int main(void)
{
int num = 0;
int i = 0;
//for test
for(i=0; i20; i++)
{
num = produce_rand(100,200);
/*注意這里的休眠是必要的,因?yàn)槭怯胻ime(NULL)作為種子,如果直接運(yùn)行,那么很有可能產(chǎn)生的多個(gè)一樣的隨機(jī)數(shù)*/
sleep(1);
printf("%d\n",num);
}
return 0;
}
int produce_rand(int start, int end)
{
int rand_num;
int start_t;
int end_t;
//確定參數(shù)范圍,確保start_t=end
(start=end)?(start_t=start,end_t=end):(start_t=end,end_t=start);
//time(NULL)為隨機(jī)種子,播種子
srand((unsigned)time(NULL));
//產(chǎn)生隨機(jī)數(shù)
rand_num =rand()%(end_t-start_t+1)+start_t;
return rand_num;
}
先定義隨機(jī)函數(shù)f
然后定義一個(gè)整數(shù)變量a
定義一個(gè)數(shù)組(長(zhǎng)度20個(gè)數(shù))b
*套用隨機(jī)函數(shù)產(chǎn)生整數(shù)賦予變量a
比較變量a的值是否在100~1000,是就依次放到數(shù)組中,不是就繼續(xù)用隨機(jī)函數(shù)產(chǎn)生整數(shù)比較。
循環(huán)從*開始的步驟,可以利用for來確定直到b(19)也被賦值
然后用起泡法排序數(shù)組b中的20個(gè)數(shù)
最后輸出的時(shí)候用循環(huán),b(0)~b(9)后輸出回車,接著輸出b(10)~b(19)
程序懶得寫了
而且說實(shí)話我不知道隨機(jī)函數(shù)在c怎么寫。。。
在matlab里直接可以調(diào)用的說。。
#includestdio.h
#includestdlib.h
#includetime.h
int main(void)
{
srand(time(0));
int i=0; //用于下面的循環(huán)
int a[20]={0}; //用于存儲(chǔ)產(chǎn)生的20個(gè)隨機(jī)數(shù)。
double ave=0; //用于求20個(gè)隨機(jī)數(shù)的和,為了求他們的平均數(shù)。
for(i =0;i=19;i++)
{
a[i]=rand()%90+10; //rand()%90產(chǎn)生0-89的隨機(jī)數(shù),加上10后就是10-99的隨機(jī)數(shù)。
ave=ave+a[i];
printf("第%d個(gè)隨機(jī)數(shù)是:\n",i+1,a[i]);
}
ave=ave/20;
for(i =0;i=19;i++) //打印大于平均數(shù)值的隨機(jī)數(shù);
{
if(a[i]ave)
{
printf("第%d個(gè)隨機(jī)數(shù)等于%lf大于平均數(shù)%lf\n",i+1,a[i],ave)
}
}
return 0;
}
結(jié)果:
第1個(gè)隨機(jī)數(shù)是:34
第2個(gè)隨機(jī)數(shù)是:32
第3個(gè)隨機(jī)數(shù)是:86
第4個(gè)隨機(jī)數(shù)是:20
第5個(gè)隨機(jī)數(shù)是:86
第6個(gè)隨機(jī)數(shù)是:43
第7個(gè)隨機(jī)數(shù)是:26
第8個(gè)隨機(jī)數(shù)是:65
第9個(gè)隨機(jī)數(shù)是:98
第10個(gè)隨機(jī)數(shù)是:57
第11個(gè)隨機(jī)數(shù)是:98
第12個(gè)隨機(jī)數(shù)是:59
第13個(gè)隨機(jī)數(shù)是:72
第14個(gè)隨機(jī)數(shù)是:27
第15個(gè)隨機(jī)數(shù)是:25
第16個(gè)隨機(jī)數(shù)是:55
第17個(gè)隨機(jī)數(shù)是:53
第18個(gè)隨機(jī)數(shù)是:83
第。。。。。。。。
rand和srand的用法
首先我們要對(duì)rand&srand有個(gè)總體的看法:srand初始化隨機(jī)種子,rand產(chǎn)生隨機(jī)數(shù),下面將詳細(xì)說明。
rand(產(chǎn)生隨機(jī)數(shù))
表頭文件: #includestdlib.h
定義函數(shù) :int rand(void)
函數(shù)說明 :
因?yàn)閞and的內(nèi)部實(shí)現(xiàn)是用線性同余法做的,他不是真的隨機(jī)數(shù),只不過是因?yàn)槠渲芷谔貏e長(zhǎng),所以有一定的范圍里可看成是隨機(jī)的,rand()會(huì)返回一隨機(jī)數(shù)值,范圍在0至RAND_MAX 間。在調(diào)用此函數(shù)產(chǎn)生隨機(jī)數(shù)前,必須先利用srand()設(shè)好隨機(jī)數(shù)種子,如果未設(shè)隨機(jī)數(shù)種子,rand()在調(diào)用時(shí)會(huì)自動(dòng)設(shè)隨機(jī)數(shù)種子為1。rand ()產(chǎn)生的是假隨機(jī)數(shù)字,每次執(zhí)行時(shí)是相同的。若要不同,以不同的值來初始化它.初始化的函數(shù)就是srand()。
返回值:
返回0至RAND_MAX之間的隨機(jī)整數(shù)值,RAND_MAX的范圍最少是在32767之間(int),即雙字節(jié)(16位數(shù))。若用unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。
0~RAND_MAX每個(gè)數(shù)字被選中的機(jī)率是相同的。
范例:
/* 產(chǎn)生介于1 到10 間的隨機(jī)數(shù)值,此范例未設(shè)隨機(jī)數(shù)種子,完整的隨機(jī)數(shù)產(chǎn)生請(qǐng)參考
srand()*/
#includestdlib.h
main()
{
int i,j;
for(i=0;i10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
執(zhí)行:
9 4 8 8 10 2 4 8 3 6
9 4 8 8 10 2 4 8 3 6 //再次執(zhí)行仍然產(chǎn)生相同的隨機(jī)數(shù)
srand(設(shè)置隨機(jī)數(shù)種子)
表頭文件:#includestdlib.h
定義函數(shù):void srand (unsigned int seed);
函數(shù)說明:
srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。參數(shù)seed必須是個(gè)整數(shù),通常可以利用geypid()或time(0)的返回值來當(dāng)做seed。如果每次seed都設(shè)相同值,rand()所產(chǎn)生的隨機(jī)數(shù)值每次就會(huì)一樣。
范例
/* 產(chǎn)生介于1 到10 間的隨機(jī)數(shù)值,此范例與執(zhí)行結(jié)果可與rand()參照*/
#includetime.h
#includestdlib.h
main()
{
int i,j;
srand((int)time(0));
for(i=0;i10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf(" %d ",j);
}
}
執(zhí)行:與rand范例比較
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7
又或:
用"int x = rand() % 100;"來生成 0 到 100 之間的隨機(jī)數(shù)這種方法是不或取的,比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))產(chǎn)生一個(gè)0到n之間的隨機(jī)數(shù)
int main(void)
{
int i;
time_t t;
srand((unsigned) time(t));
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i10; i++)
printf("%d\n", rand() % 100);
return 0;
}
除以上所說的之外,補(bǔ)充一點(diǎn)就是srand這個(gè)函數(shù)一定要放在循環(huán)外面或者是循環(huán)調(diào)用的外面,否則的話得到的是相同的數(shù)字。
MSDN中的例子。
// crt_rand.c
// This program seeds the random-number generator
// with the time, then displays 10 random integers.
//
#include stdlib.h
#include stdio.h
#include time.h
int main( void )
{
int i;
// Seed the random-number generator with current time so that
// the numbers will be different every time we run.
//
srand( (unsigned)time( NULL ) );
// Display 10 numbers.
for( i = 0; i 10;i++ )
printf( " %6d\n", rand() );
printf("\n");
// Usually, you will want to generate a number in a specific range,
// such as 0 to 100, like this:
{
int RANGE_MIN = 0;
int RANGE_MAX = 100;
for (i = 0; i 10; i++ )
{
int rand100 = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
printf( " %6d\n", rand100);
}
}
總結(jié):
我們知道rand()函數(shù)可以用來產(chǎn)生隨機(jī)數(shù),但是這不是真真意義上的隨機(jī)數(shù),是一個(gè)偽隨機(jī)數(shù),是根據(jù)一個(gè)數(shù),我們可以稱它為種了,為基準(zhǔn)以某個(gè)遞推公式推算出來的一系數(shù),當(dāng)這系列數(shù)很大的時(shí)候,就符合正態(tài)公布,從而相當(dāng)于產(chǎn)生了隨機(jī)數(shù),但這不是真正的隨機(jī)數(shù),當(dāng)計(jì)算機(jī)正常開機(jī)后,這個(gè)種子的值是定了的,除非你破壞了系統(tǒng),為了改變這個(gè)種子的值,C提供了 srand()函數(shù),它的原形是void srand( int a) 功能是
初始化隨機(jī)產(chǎn)生器既rand()函數(shù)的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函數(shù),我們是可以產(chǎn)生可以預(yù)見的隨機(jī)序列,
那我們?nèi)绾尾拍墚a(chǎn)生不可預(yù)見的隨機(jī)序列呢?我們可能常常需要這樣的隨機(jī)序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因?yàn)槊恳淮芜\(yùn)行程序的時(shí)間是不同的,對(duì)了,你知道time() 函數(shù)的功能是返回從1970/01/01到現(xiàn)在的秒數(shù)的吧,可能這個(gè)起始時(shí)間不正確,你查一下對(duì)不對(duì)吧,C還提供了另一個(gè)更方便的函數(shù), randomize()
原形是void randomize(),功能是用來始初rand() 的種子的初始值,而且該值是不確定的,它相當(dāng)于srand((unsign)(time(NULL)) 不過應(yīng)注意的是randomize()的功能要通過time來實(shí)現(xiàn)所以在調(diào)用它時(shí)頭文件要包含time.h罷了