C語言隨機函數(shù)主要用于實現(xiàn)一組隨機數(shù)的生成。
為融水等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及融水網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、做網(wǎng)站、融水網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
代碼示例如下:
#includestdio.h
#includestdlib.h
int main ()
{
int a;
a=rand()%4;
printf("%d\n",a);
return 0;
}
C預(yù)先生成一組隨機數(shù),每次調(diào)用隨機函數(shù)時從指針?biāo)赶虻奈恢瞄_始取值,因此使用rand()重復(fù)運行程序產(chǎn)生的隨機數(shù)都是相同的,可以通過srand()函數(shù)來改變指針位置。
擴展資料:
C語言隨機函數(shù)指針位置
void srand( unsigned int seed )
改變隨機數(shù)表的指針位置(用seed變量控制)。一般配合time(NULL)使用,因為時間每時每刻都在改變,產(chǎn)生的seed值都不同。
基于毫秒級隨機數(shù)產(chǎn)生方法:
#includewindows.h
種子設(shè)為:srand(unsigned int seed);
srand(GetTickCount());
參考資料:百度百科-C語言隨機函數(shù)
#include
stdlib.h
#include
stdio.h
#include
time.h
void
main()
{
int
i,count[100];
for(i=0;i100;i++)
{count[i]=random(100);//設(shè)定
取值范圍
,這表明
隨機數(shù)
是0-100之間取
printf("%d\n",count[i]);
}
}
把 srand( time(0) ); 放在循環(huán)外每次產(chǎn)生隨機數(shù)的種子也是一樣的啊,為什么產(chǎn)生的隨機數(shù)就不一樣了?
因為隨機函數(shù)只需要一個種子就能產(chǎn)生一系列的隨機數(shù),并不是每個隨機數(shù)都需要一個種子。
你把 srand(time(0)) 放到循環(huán)前面就可以了。
原因: time(0)返回的是系統(tǒng)的時間(從1970.1.1午夜算起),單位:秒,而那個循環(huán)運行起來耗時連0.000001秒都不到! 也就是說,srand(time(0)) 連著4次的種子是一樣的,種子一樣,生產(chǎn)的隨機數(shù)當(dāng)然是一樣了。
如果你在把srand()放循環(huán)里面,在中間加個sleep函數(shù),消耗一點時間(間隔大于1秒),那么生成的rand 就不一樣了.但是這樣做很不好,連著兩次用srand生成的種子,間隔一樣,生產(chǎn)的隨機數(shù)間隔有會有規(guī)律性。
另:因為兩次運行同一程序的時間肯定是不一樣的,所以把srand放在循環(huán)前面可以得不同的種子,這樣才能得到你想要的。
要用srand()函數(shù)設(shè)置一個隨機數(shù)種子
例1:
#include stdlib.h
#include iostream
#include time.h
using namespace std;
int main()
{
srand( (unsigned)time( NULL ) ); // 隨機數(shù)種子產(chǎn)生
int i=rand()%100-1; // 產(chǎn)生100以內(nèi)的隨機數(shù)并賦給i
coutiendl;
getchar();
return 0;
}
例2:
#include stdio.h
#include stdlib.h
main()
{
int seed=1000; // 種子
int i;
int m[16] ;
int nn=0;
double r;
printf("enter seed please\n");
scanf("%d",seed);
srand(seed); // 初始化隨機數(shù)生成器
for (i=0;i=15;i++) m[i] = 0;
while (nn 10 ){
// r 是雙精度浮點隨機數(shù),范圍0.0到1.0
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
i =(int) ( r * 15.0);
if (m[i] == 0) {
m[i] = 1; nn = nn + 1;
printf("%d ",i);
};
}
}
C++的隨機函數(shù)
C++/c語言里,是沒有辦法得到一個真正的隨機數(shù)序列的.想要等到一個真正的隨機數(shù)序列,必須使用特定的隨機數(shù)硬件發(fā)生器.也就是說,軟件是沒有辦法產(chǎn)生真正的隨機數(shù).因為軟件必須按照一定的邏輯來編寫.既然是按照特定的邏輯(也就是說算法)來編寫 ,那么產(chǎn)生的運算結(jié)果就是一定的.這一點,就是軟件天生的特性.想想看,如果一個軟件,同樣的代碼喝條件下,每次運行的結(jié)果不一樣,那還有誰會用?
所以,在C++/C語言中,就有了"偽隨機數(shù)"的概念.意思也就是說,通過一個特定的算法,產(chǎn)生一個假的隨機數(shù)序列.那么,程序員又希望這個隨機數(shù)序列跟接近真正的隨機數(shù)序列,也就是希望得到的序列的不一樣,所以有了一個"播種"的概念.
srand(unsgined int seed);
這個函數(shù)就是用來"播種"的.通過一個"種子"(SEED),來控制隨機數(shù)的序列不一樣.只要種子不一樣,那么通過rand()得到的隨機數(shù)序列就不一樣.反過來說,如果種子一樣,那么通過srand()得到的隨機數(shù)就是一樣的.
srand(0);
for( int i = 0; i 10; i++)
{
coutrand()' ';
}
你試著將這個程序執(zhí)行兩次,你會發(fā)現(xiàn)兩次的結(jié)果一樣。那是因為,一旦“種子”確定了,那么這個隨機數(shù)序列就確定了。軟件天生的“行為可重復(fù)性”決定了這一點。
所以,一般在播種的時候,喜歡用一個隨機的種子.在絕大多數(shù)的情況下,會使用當(dāng)前的系統(tǒng)時間.這個數(shù)字在每次程序運行的時候都不一樣.除非你手動的改系統(tǒng)時間.
編程時有時需要隨機輸入一些數(shù),這是調(diào)用隨機函數(shù)可以完成此相命令.
# include “stdio.h”
# include “stdlib.h”
# include “time.h” /*需引用的頭文件*/
srand((unsigned)time(NULL)); /*隨機種子*/
n=rand()%(Y-X+1)+X; /*n為X~Y之間的隨機數(shù)*/
進一步解釋
有
srand()設(shè)置隨機數(shù)種子,rand()得到隨機數(shù)
random()的函數(shù)原型為int random(int num)
它的作用是Returns an integer between 0 and (num-1)
而randomize的函數(shù)原型為void randomize(void)
它的作用是Initializes the random number generator with a random value.
它們的區(qū)別是前者限定隨機數(shù)的產(chǎn)生范圍,而后者這完全是隨機的,另外使用這兩個函數(shù)時
應(yīng)含入
#include stdlib.h
#include time.h
頭文件。
一個例子:
用法如下:
#include stdlib.h
#include stdio.h
#include time.h
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); //用系統(tǒng)時間當(dāng)種子,對隨機函數(shù)進行初始化
for( i = 0; i 10;i++ )
{
k=rand()%100; //產(chǎn)生各個隨機數(shù)
printf( " k=%d\n", k );
}
}
再抄個~
在VC中設(shè)計到隨機數(shù)有兩個函數(shù)
srand() and rand()
srand() 的作用是是一個種子,提供每次獲得隨機數(shù)的基數(shù)而已,rand()根據(jù)種子而產(chǎn)生隨機數(shù)
注意
1:srand() 里的值必須是動態(tài)變化的,否則得到的隨機數(shù)就是一個固定數(shù)
2:其實可以不用寫srand() ,只用rand()就可以了,省事,簡單,例子如下
如果我們想得到一個 0-60的隨機數(shù)那么可以寫成
int i;
i=rand()%60;
就可以了。
當(dāng)然最好有個統(tǒng)一的標(biāo)注如下:
int i;
srand((unsigned)time( NULL ));
i=rand()%60;
這樣就OK了
例題隨機取數(shù),取1到99之間
1、#include iostream.h
#include stdlib.h
#include time.h
int main()
{
int n;//n為隨機數(shù)
srand(time(NULL));
n=1+rand()%99;
coutn;
return 0;
}
2、#includeiostream.h
#includestdlib.h
#includetime.h
void main()
{
int a;
srand((unsigned) time(NULL));
a=rand()%99+1;
couta;
}
3、#include iostream.h
#include stdlib.h
#include time.h
void main()
{
int j;
srand((unsigned)time(NULL));
loop:
j=rand()%100;
if(j==0)
{
cout"error"endl;
goto loop;
}
else coutjendl;
}
4、如果象樓上的你的那種做法做下去
那應(yīng)該是100%而不是98%
你一定是少了
srand(...........);
其實這個程序也不錯
#include iostream
#include cstdlib
using namespace std;
int main()
{
int counter;
for(counter=0;counter10;counter++)
{
srand(counter+1);
cout"Random number"counter+1":"rand()endl;
}
system("pause");
return 0;
}
5、#include iostream.h
#include stdlib.h
int main()
{
int shu =100;
int n;//n為隨機數(shù)
srand(shu);
n=rand() % shu;
coutn;
return 0;
}
不拿時間作隨機數(shù),可以設(shè)一個種子數(shù)不清100這樣就產(chǎn)生0~99間的隨機數(shù)。
不過我沒有測試從復(fù)率,誰測了告訴我一下。
幾個概念
隨機數(shù):數(shù)學(xué)上產(chǎn)生的都是偽隨機數(shù),真正的隨機數(shù)使用物理方法產(chǎn)生的。
隨機數(shù)種子:隨機數(shù)的產(chǎn)生是由算術(shù)規(guī)則產(chǎn)生的,srand(seed)的隨機數(shù)種子不同,rand()的隨機數(shù)值就不同,倘若每次的隨機數(shù)種子一樣,則rand()的值就一樣。所以要產(chǎn)生隨機數(shù),則srand(seed)的隨機數(shù)種子必須也要隨機的。
用srand()產(chǎn)生隨機數(shù)種子
原型:void srand ( unsigned int seed );
作用是設(shè)置好隨機數(shù)種子,為了讓隨機數(shù)種子是隨機的,通常用time(NULL)的值來當(dāng)seed。
time()用于隨機數(shù)種子
函數(shù)原型:time_t time ( time_t * timer );
time()函數(shù)表示返回1970-1-1 00:00:00 到當(dāng)前時間的秒數(shù)。
用的時候這樣:srand(unsigned(time(NULL)));例如產(chǎn)生1~10之間的隨機整數(shù)
#include#includeint main(){ ?srand(time(NULL)); ?for(int i=0;i 10;i++) ?{ ? ?int randValue=rand()%10; ?}}
上面的程序中要注意srand是在for循環(huán)外面的,如果把srand放到for循環(huán)里面,則每次產(chǎn)生的隨機數(shù)都相同。
用rand()產(chǎn)生隨機數(shù)
原型:int rand ( void );
作用是產(chǎn)生一個隨機數(shù),當(dāng)然隨機數(shù)是有范圍的,為0~RAND_MAX之間,隨機數(shù)與隨機數(shù)種子有關(guān)。具體來說是,在產(chǎn)生隨機數(shù) rand()被調(diào)用的時候,它會這樣執(zhí)行:
如果用戶之前調(diào)用過 srand(seed)的話,他會重新調(diào)用一遍 srand(seed)以產(chǎn)生隨機數(shù)種子;
如果發(fā)現(xiàn)沒有調(diào)用過 srand(seed)的話,會自動調(diào)用 srand(1)一次。
如果調(diào)用srand(seed)產(chǎn)生的隨機數(shù)種子是一樣的.話(即seed的值相同),rand()產(chǎn)生的隨機數(shù)也相同。
所以,如果希望rand()每次調(diào)用產(chǎn)生的值都不一樣,就需要每次調(diào)用srand(seed)一次,而且seed不能相同。這里就是經(jīng)常采用time(NULL)產(chǎn)生隨機數(shù)種子的原因。
C語言中可以使用rand()函數(shù)來生成一個從0到RAND_MAX的uniform分布?;谶@個函數(shù),我們可以構(gòu)造出一些特定的隨機數(shù)生成器來滿足我們的需求。
(一)0到1的uniform分布:
//generate a random number in the range of [0,1]double uniform_zero_to_one(){ ?return (double)rand()/RAND_MAX;}
(二)任意實數(shù)區(qū)間的uniform分布:
//generate a random real number in [start,end]double uniform_real(double start,double end){ ?double rate=(double)rand()/RAND_MAX; ?return start+(end-start)*rate;}
(三)任意整數(shù)區(qū)間的uniform分布:
//generate a random integer number in [start,end)int uniform_integer(int start,int end){ ?int base=rand(); ?if(base==RAND_MAX) ? ?return uniform_integer(start,end); ?int range=end-start; ?int remainder=RAND_MAX%range; ?int bucket=RAND_MAX/range; ?if(baseRAND_MAX-remainder) ? ?return start+base/bucket; ?else ? ?return uniform_integer(start,end);}
這個函數(shù)要特別說明一下,平常時候我們都是用rand()%n來生成0到n-1的隨機數(shù),但是按這種方法生成的分布并不是uniform的,另外由于RAND_MAX只有32767,因此要生成比這個數(shù)更大的隨機數(shù)需要另外想辦法,理論上可以直接用0到1的uniform分布直接放縮,但實際效果不好。這里給出一種移位方式的實現(xiàn)。
(四)32bits的隨機數(shù)
//generate a random 32 bits integer number int rand32(){ ?return ((rand()16)+(rand()1)+rand()%2);}
有了32bits的隨機數(shù)生成方法,就可以構(gòu)造32bits范圍內(nèi)的隨機整數(shù)區(qū)間了,方法和之前16bits的情況一樣。
(五)32bits范圍內(nèi)的隨機整數(shù)區(qū)間
//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){ ? int base=rand32(); ?if(base==RAND32_MAX) ? ?return uniform_integer_32(start,end); ?int range=end-start; ?int remainder=RAND32_MAX%range; ?int bucket=RAND32_MAX/range; ?if(baseRAND32_MAX-remainder) ? ?return start+base/bucket; ?else ? ?return uniform_integer_32(start,end);}
這里RAND32_MAX定義為0x7fffffff。
除此之外,利用rand()函數(shù)構(gòu)造任意分布的隨機數(shù)也是個值得探討的問題。
理論上可以通過(0,1)的uniform分布,加上標(biāo)準(zhǔn)采樣方法(sampling)獲得。
網(wǎng)站名稱:C語言設(shè)計函數(shù)隨機 C語言中隨機函數(shù)
路徑分享:http://chinadenli.net/article22/hhhhjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)