本文由青松原創(chuàng)并依GPL-V2及其后續(xù)版本發(fā)放,轉(zhuǎn)載請注明出處且應(yīng)包含本行聲明。\x0d\x0a\x0d\x0aC++中常用rand()函數(shù)生成隨機(jī)數(shù),但嚴(yán)格意義上來講生成的只是偽隨機(jī)數(shù)(pseudo-random integral number)。生成隨機(jī)數(shù)時需要我們指定一個種子,如果在程序內(nèi)循環(huán),那么下一次生成隨機(jī)數(shù)時調(diào)用上一次的結(jié)果作為種子。但如果分兩次執(zhí)行程序,那么由于種子相同,生成的“隨機(jī)數(shù)”也是相同的。\x0d\x0a\x0d\x0a在工程應(yīng)用時,我們一般將系統(tǒng)當(dāng)前時間(Unix時間)作為種子,這樣生成的隨機(jī)數(shù)更接近于實(shí)際意義上的隨機(jī)數(shù)。給一下例程如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a srand(unsigned(time(0)));\x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout "No." icnt+1 ": " int(random(0,10)) endl;\x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運(yùn)行結(jié)果\x0d\x0a* No.1: 3\x0d\x0a* No.2: 9\x0d\x0a* No.3: 0\x0d\x0a* No.4: 9\x0d\x0a* No.5: 5\x0d\x0a* No.6: 6\x0d\x0a* No.7: 9\x0d\x0a* No.8: 2\x0d\x0a* No.9: 9\x0d\x0a* No.10: 6\x0d\x0a*/\x0d\x0a利用這種方法能不能得到完全意義上的隨機(jī)數(shù)呢?似乎9有點(diǎn)多哦?卻沒有1,4,7?!我們來做一個概率實(shí)驗(yàn),生成1000萬個隨機(jī)數(shù),看0-9這10個數(shù)出現(xiàn)的頻率是不是大致相同的。程序如下:\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a int a[10] = ;\x0d\x0a const int Gen_max = 10000000;\x0d\x0a srand(unsigned(time(0)));\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != Gen_max; ++icnt)\x0d\x0a switch(int(random(0,10)))\x0d\x0a {\x0d\x0a case 0: a[0]++; break;\x0d\x0a case 1: a[1]++; break;\x0d\x0a case 2: a[2]++; break;\x0d\x0a case 3: a[3]++; break;\x0d\x0a case 4: a[4]++; break;\x0d\x0a case 5: a[5]++; break;\x0d\x0a case 6: a[6]++; break;\x0d\x0a case 7: a[7]++; break;\x0d\x0a case 8: a[8]++; break;\x0d\x0a case 9: a[9]++; break;\x0d\x0a default: cerr "Error!" endl; exit(-1);\x0d\x0a }\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout icnt ": " setw(6) setiosflags(ios::fixed) setprecision(2) double(a[icnt])/Gen_max*100 "%" endl;\x0d\x0a \x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運(yùn)行結(jié)果\x0d\x0a* 0: 10.01%\x0d\x0a* 1: 9.99%\x0d\x0a* 2: 9.99%\x0d\x0a* 3: 9.99%\x0d\x0a* 4: 9.98%\x0d\x0a* 5: 10.01%\x0d\x0a* 6: 10.02%\x0d\x0a* 7: 10.01%\x0d\x0a* 8: 10.01%\x0d\x0a* 9: 9.99%\x0d\x0a*/\x0d\x0a可知用這種方法得到的隨機(jī)數(shù)是滿足統(tǒng)計(jì)規(guī)律的。\x0d\x0a\x0d\x0a另:在Linux下利用GCC編譯程序,即使我執(zhí)行了1000000次運(yùn)算,是否將random函數(shù)定義了inline函數(shù)似乎對程序沒有任何影響,有理由相信,GCC已經(jīng)為我們做了優(yōu)化。但是冥冥之中我又記得要做inline優(yōu)化得加O3才行...\x0d\x0a\x0d\x0a不行,于是我們把循環(huán)次數(shù)改為10億次,用time命令查看執(zhí)行時間:\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.768s\x0d\x0auser 2m4.405s\x0d\x0asys 0m0.038s\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.269s\x0d\x0auser 2m4.077s\x0d\x0asys 0m0.025s\x0d\x0a\x0d\x0a前一次為進(jìn)行inline優(yōu)化的情形,后一次為沒有作inline優(yōu)化的情形,兩次結(jié)果相差不大,甚至各項(xiàng)指標(biāo)后者還要好一些,不知是何緣由...
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、淳安ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的淳安網(wǎng)站制作公司
C++的隨機(jī)函數(shù)
C++/c語言里,是沒有辦法得到一個真正的隨機(jī)數(shù)序列的.想要等到一個真正的隨機(jī)數(shù)序列,必須使用特定的隨機(jī)數(shù)硬件發(fā)生器.也就是說,軟件是沒有辦法產(chǎn)生真正的隨機(jī)數(shù).因?yàn)檐浖仨毎凑找欢ǖ倪壿媮砭帉?既然是按照特定的邏輯(也就是說算法)來編寫 ,那么產(chǎn)生的運(yùn)算結(jié)果就是一定的.這一點(diǎn),就是軟件天生的特性.想想看,如果一個軟件,同樣的代碼喝條件下,每次運(yùn)行的結(jié)果不一樣,那還有誰會用?
所以,在C++/C語言中,就有了"偽隨機(jī)數(shù)"的概念.意思也就是說,通過一個特定的算法,產(chǎn)生一個假的隨機(jī)數(shù)序列.那么,程序員又希望這個隨機(jī)數(shù)序列跟接近真正的隨機(jī)數(shù)序列,也就是希望得到的序列的不一樣,所以有了一個"播種"的概念.
srand(unsgined int seed);
這個函數(shù)就是用來"播種"的.通過一個"種子"(SEED),來控制隨機(jī)數(shù)的序列不一樣.只要種子不一樣,那么通過rand()得到的隨機(jī)數(shù)序列就不一樣.反過來說,如果種子一樣,那么通過srand()得到的隨機(jī)數(shù)就是一樣的.
srand(0);
for( int i = 0; i 10; i++)
{
coutrand()' ';
}
你試著將這個程序執(zhí)行兩次,你會發(fā)現(xiàn)兩次的結(jié)果一樣。那是因?yàn)?,一旦“種子”確定了,那么這個隨機(jī)數(shù)序列就確定了。軟件天生的“行為可重復(fù)性”決定了這一點(diǎn)。
所以,一般在播種的時候,喜歡用一個隨機(jī)的種子.在絕大多數(shù)的情況下,會使用當(dāng)前的系統(tǒng)時間.這個數(shù)字在每次程序運(yùn)行的時候都不一樣.除非你手動的改系統(tǒng)時間.
編程時有時需要隨機(jī)輸入一些數(shù),這是調(diào)用隨機(jī)函數(shù)可以完成此相命令.
# include “stdio.h”
# include “stdlib.h”
# include “time.h” /*需引用的頭文件*/
srand((unsigned)time(NULL)); /*隨機(jī)種子*/
n=rand()%(Y-X+1)+X; /*n為X~Y之間的隨機(jī)數(shù)*/
進(jìn)一步解釋
有
srand()設(shè)置隨機(jī)數(shù)種子,rand()得到隨機(jī)數(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ū)別是前者限定隨機(jī)數(shù)的產(chǎn)生范圍,而后者這完全是隨機(jī)的,另外使用這兩個函數(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)種子,對隨機(jī)函數(shù)進(jìn)行初始化
for( i = 0; i 10;i++ )
{
k=rand()%100; //產(chǎn)生各個隨機(jī)數(shù)
printf( " k=%d\n", k );
}
}
再抄個~
在VC中設(shè)計(jì)到隨機(jī)數(shù)有兩個函數(shù)
srand() and rand()
srand() 的作用是是一個種子,提供每次獲得隨機(jī)數(shù)的基數(shù)而已,rand()根據(jù)種子而產(chǎn)生隨機(jī)數(shù)
注意
1:srand() 里的值必須是動態(tài)變化的,否則得到的隨機(jī)數(shù)就是一個固定數(shù)
2:其實(shí)可以不用寫srand() ,只用rand()就可以了,省事,簡單,例子如下
如果我們想得到一個 0-60的隨機(jī)數(shù)那么可以寫成
int i;
i=rand()%60;
就可以了。
當(dāng)然最好有個統(tǒng)一的標(biāo)注如下:
int i;
srand((unsigned)time( NULL ));
i=rand()%60;
這樣就OK了
例題隨機(jī)取數(shù),取1到99之間
1、#include iostream.h
#include stdlib.h
#include time.h
int main()
{
int n;//n為隨機(jī)數(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(...........);
其實(shí)這個程序也不錯
#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為隨機(jī)數(shù)
srand(shu);
n=rand() % shu;
coutn;
return 0;
}
不拿時間作隨機(jī)數(shù),可以設(shè)一個種子數(shù)不清100這樣就產(chǎn)生0~99間的隨機(jī)數(shù)。
不過我沒有測試從復(fù)率,誰測了告訴我一下。
編譯環(huán)境為:vs2013
產(chǎn)生1到3的整型隨機(jī)數(shù)的代碼如下:
#includestdio.h
#includetime.h
#includestdlib.h
#define max 3 ? //這個函數(shù)的意義為:隨機(jī)生成最大的數(shù)為3
#define min 1 ?? //這個函數(shù)的意義為:隨機(jī)生成最小的數(shù)為1
int main()
{
int num;
srand(time(0));
num = rand() % (max - min) + min; ?// 這里的意義,“%”為模運(yùn)算
printf("隨機(jī)數(shù)為:%d\n", num);
system("pause"); ?//這個代碼可以讓彈出的黑框不會一下就消失
return 0;
}
擴(kuò)展資料:
根據(jù)密碼學(xué)原理,隨機(jī)數(shù)的隨機(jī)性檢驗(yàn)可以分為三個標(biāo)準(zhǔn):
條件一、統(tǒng)計(jì)學(xué)偽隨機(jī)性。統(tǒng)計(jì)學(xué)偽隨機(jī)性指的是在給定的隨機(jī)比特流樣本中,1的數(shù)量大致等于0的數(shù)量,同理,“10”“01”“00”“11”四者數(shù)量大致相等。類似的標(biāo)準(zhǔn)被稱為統(tǒng)計(jì)學(xué)隨機(jī)性。滿足這類要求的數(shù)字在人類“一眼看上去”是隨機(jī)的。
條件二、密碼學(xué)安全偽隨機(jī)性。其定義為,給定隨機(jī)樣本的一部分和隨機(jī)算法,不能有效的演算出隨機(jī)樣本的剩余部分。
條件三、真隨機(jī)性。其定義為隨機(jī)樣本不可重現(xiàn)。實(shí)際上只要給定邊界條件,真隨機(jī)數(shù)并不存在,可是如果產(chǎn)生一個真隨機(jī)數(shù)樣本的邊界條件十分復(fù)雜且難以捕捉(比如計(jì)算機(jī)當(dāng)?shù)氐谋镜纵椛洳▌又担?,可以認(rèn)為用這個方法演算出來了真隨機(jī)數(shù)。
隨機(jī)數(shù)分為三類:
①偽隨機(jī)數(shù):滿足第一個條件的隨機(jī)數(shù)。
②密碼學(xué)安全的偽隨機(jī)數(shù):同時滿足前兩個條件的隨機(jī)數(shù)。可以通過密碼學(xué)安全偽隨機(jī)數(shù)生成器
計(jì)算得出。
③真隨機(jī)數(shù):同時滿足三個條件的隨機(jī)數(shù)。
當(dāng)前名稱:用c語言寫radom函數(shù) c語言rand函數(shù)怎么寫
標(biāo)題URL:http://www.rwnh.cn/article14/ddgopge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、關(guān)鍵詞優(yōu)化、響應(yīng)式網(wǎng)站、Google、網(wǎng)站制作、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)