中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

用c語言寫radom函數(shù) c語言rand函數(shù)怎么寫

c語言,如何產(chǎn)生隨機(jī)數(shù)

本文由青松原創(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++的隨機(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ù)率,誰測了告訴我一下。

C語言怎樣產(chǎn)生一定范圍的隨機(jī)數(shù)?

編譯環(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)

成都網(wǎng)站建設(shè)公司
宁远县| 项城市| 隆昌县| 房山区| 岳阳市| 房产| 昆山市| 德钦县| 阿合奇县| 宜兴市| 基隆市| 温州市| 临湘市| 工布江达县| 黑山县| 阳高县| 岑溪市| 新龙县| 阿拉善右旗| 临夏县| 花莲市| 郴州市| 宝鸡市| 琼海市| 贺兰县| 镇安县| 大英县| 屯门区| 太白县| 四会市| 普兰店市| 钟祥市| 衡山县| 莆田市| 宁德市| 商南县| 遵义县| 南涧| 西充县| 宁乡县| 洮南市|