隨機(jī)函數(shù)就是產(chǎn)生數(shù)的函數(shù),c語(yǔ)言里有rand(),srand()等函數(shù)。
創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)定制設(shè)計(jì),是成都網(wǎng)站推廣公司,為廣告推廣提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站營(yíng)銷(xiāo)推廣熱線:13518219792
用法
#include
#include
#include
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); //用系統(tǒng)時(shí)間當(dāng)種子,對(duì)隨機(jī)函數(shù)進(jìn)行初始化
for( i = 0; i 10;i++ )
{
k=rand()%100; //產(chǎn)生各個(gè)隨機(jī)數(shù)
printf( " k=%d/n", k );
}
}
詳述
rand() srand() 頭文件為#include
標(biāo)準(zhǔn)C庫(kù)中函數(shù)rand()可以生成0~RAND_MAX之間的一個(gè)隨機(jī)數(shù),其中RAND_MAX 是stdlib.h 中定義的一個(gè)整數(shù),它與系統(tǒng)有關(guān)。
rand()函數(shù)沒(méi)有輸入?yún)?shù),直接通過(guò)表達(dá)式rand()來(lái)引用,rand()%n是產(chǎn)生的隨機(jī)數(shù)對(duì)n取余,起到了取0到n-1之間隨機(jī)數(shù)的作用;
例如可以用下面的語(yǔ)句來(lái)打印兩個(gè)隨機(jī)數(shù): printf("Random numbers are: %i %i/n",rand(),rand());
因?yàn)閞and()函數(shù)是按指定的順序來(lái)產(chǎn)生整數(shù),而未指定運(yùn)行的種子,所以rand()每次使用的都是同一個(gè)種子來(lái)產(chǎn)生隨機(jī)數(shù)序列,因此每次執(zhí)行上面的語(yǔ)句都打印相同的兩個(gè)值,所以說(shuō)C語(yǔ)言的隨機(jī)并不是正真意義上的隨機(jī)。
為了時(shí)程序在每次執(zhí)行時(shí)都能生成一個(gè)新序列的隨機(jī)值,我們通常通過(guò)為隨機(jī)數(shù)生成器提供一粒新的隨機(jī)種子。函數(shù) srand()(來(lái)自stdlib.h)可以為隨機(jī)數(shù)生成器播散種子。只要種子不同rand()函數(shù)就會(huì)產(chǎn)生不同的隨機(jī)數(shù)序列。srand()稱為隨機(jī)數(shù)生成器的初始化器。
srand( (unsigned)time( NULL ) ); 用系統(tǒng)時(shí)間當(dāng)種子,對(duì)隨機(jī)函數(shù)進(jìn)行初始化,每次的系統(tǒng)時(shí)間不同,所以種子也就不同,產(chǎn)生的隨機(jī)數(shù)序列也就不同。
C++的隨機(jī)函數(shù)
C++/c語(yǔ)言里,是沒(méi)有辦法得到一個(gè)真正的隨機(jī)數(shù)序列的.想要等到一個(gè)真正的隨機(jī)數(shù)序列,必須使用特定的隨機(jī)數(shù)硬件發(fā)生器.也就是說(shuō),軟件是沒(méi)有辦法產(chǎn)生真正的隨機(jī)數(shù).因?yàn)檐浖仨毎凑找欢ǖ倪壿媮?lái)編寫(xiě).既然是按照特定的邏輯(也就是說(shuō)算法)來(lái)編寫(xiě) ,那么產(chǎn)生的運(yùn)算結(jié)果就是一定的.這一點(diǎn),就是軟件天生的特性.想想看,如果一個(gè)軟件,同樣的代碼喝條件下,每次運(yùn)行的結(jié)果不一樣,那還有誰(shuí)會(huì)用?
所以,在C++/C語(yǔ)言中,就有了"偽隨機(jī)數(shù)"的概念.意思也就是說(shuō),通過(guò)一個(gè)特定的算法,產(chǎn)生一個(gè)假的隨機(jī)數(shù)序列.那么,程序員又希望這個(gè)隨機(jī)數(shù)序列跟接近真正的隨機(jī)數(shù)序列,也就是希望得到的序列的不一樣,所以有了一個(gè)"播種"的概念.
srand(unsgined int seed);
這個(gè)函數(shù)就是用來(lái)"播種"的.通過(guò)一個(gè)"種子"(SEED),來(lái)控制隨機(jī)數(shù)的序列不一樣.只要種子不一樣,那么通過(guò)rand()得到的隨機(jī)數(shù)序列就不一樣.反過(guò)來(lái)說(shuō),如果種子一樣,那么通過(guò)srand()得到的隨機(jī)數(shù)就是一樣的.
srand(0);
for( int i = 0; i 10; i++)
{
coutrand()' ';
}
你試著將這個(gè)程序執(zhí)行兩次,你會(huì)發(fā)現(xiàn)兩次的結(jié)果一樣。那是因?yàn)椋坏胺N子”確定了,那么這個(gè)隨機(jī)數(shù)序列就確定了。軟件天生的“行為可重復(fù)性”決定了這一點(diǎn)。
所以,一般在播種的時(shí)候,喜歡用一個(gè)隨機(jī)的種子.在絕大多數(shù)的情況下,會(huì)使用當(dāng)前的系統(tǒng)時(shí)間.這個(gè)數(shù)字在每次程序運(yùn)行的時(shí)候都不一樣.除非你手動(dòng)的改系統(tǒng)時(shí)間.
編程時(shí)有時(shí)需要隨機(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ī)的,另外使用這兩個(gè)函數(shù)時(shí)
應(yīng)含入
#include stdlib.h
#include time.h
頭文件。
一個(gè)例子:
用法如下:
#include stdlib.h
#include stdio.h
#include time.h
void main( void )
{
int i,k;
srand( (unsigned)time( NULL ) ); //用系統(tǒng)時(shí)間當(dāng)種子,對(duì)隨機(jī)函數(shù)進(jìn)行初始化
for( i = 0; i 10;i++ )
{
k=rand()%100; //產(chǎn)生各個(gè)隨機(jī)數(shù)
printf( " k=%d\n", k );
}
}
再抄個(gè)~
在VC中設(shè)計(jì)到隨機(jī)數(shù)有兩個(gè)函數(shù)
srand() and rand()
srand() 的作用是是一個(gè)種子,提供每次獲得隨機(jī)數(shù)的基數(shù)而已,rand()根據(jù)種子而產(chǎn)生隨機(jī)數(shù)
注意
1:srand() 里的值必須是動(dòng)態(tài)變化的,否則得到的隨機(jī)數(shù)就是一個(gè)固定數(shù)
2:其實(shí)可以不用寫(xiě)srand() ,只用rand()就可以了,省事,簡(jiǎn)單,例子如下
如果我們想得到一個(gè) 0-60的隨機(jī)數(shù)那么可以寫(xiě)成
int i;
i=rand()%60;
就可以了。
當(dāng)然最好有個(gè)統(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í)這個(gè)程序也不錯(cuò)
#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;
}
不拿時(shí)間作隨機(jī)數(shù),可以設(shè)一個(gè)種子數(shù)不清100這樣就產(chǎn)生0~99間的隨機(jī)數(shù)。
不過(guò)我沒(méi)有測(cè)試從復(fù)率,誰(shuí)測(cè)了告訴我一下。
源程序代碼以及算法解釋如下:
產(chǎn)生1-10隨機(jī)數(shù)程序:
#include iostream
#include time.h
using namespace std;
int main()
{
const int n = 10;//定義隨機(jī)數(shù)個(gè)數(shù)
int number[n] = { NULL };//定義隨機(jī)數(shù)存儲(chǔ)的數(shù)組
srand((unsigned)time(NULL));//初始化隨機(jī)函數(shù)
number[0] = rand() % n;//第一個(gè)隨機(jī)數(shù)無(wú)需比較
cout number[0] " ";
for (int i = 1; i n; i++)//其余隨機(jī)數(shù)循環(huán)產(chǎn)生
{
int j = 0;
number[i] = rand() % n;//產(chǎn)生隨機(jī)數(shù)
while (1)
{
if (number[i] == number[j])//若有相同則繼續(xù)循環(huán)重新安排隨機(jī)數(shù)
{
number[i] = rand() % n;//產(chǎn)生隨機(jī)數(shù)
j = 0;//若遇到相同的就從頭遍歷
continue;
}
if (j == (i - 1))//若遍歷完就跳出
break;
j++;
}
cout number[i] " ";
}
cout endl;
return 0;
}
程序運(yùn)行結(jié)果如下:
擴(kuò)展資料:
利用vector進(jìn)行隨機(jī)數(shù)輸出:
#include iostream
#include vector
#include time.h
using namespace std;
int main()
{
const int n = 10;
int randnum;
vectorint number;
for (int i = 0; i n; i++)
{
number.push_back(i + 1);????//從尾部添加元素
cout number[i] " ";
}
cout endl;
srand((unsigned)time(NULL));
for (int j = 0; j n; j++)?????//其余隨機(jī)數(shù)循環(huán)產(chǎn)生
{
randnum = rand() % (n - j);????//rand函數(shù)生成的隨機(jī)數(shù)是0-(n-1)
cout number.at(randnum) " ";
number.erase(number.begin() + randnum);
}
cout endl;
return 0;
}
rand函數(shù)也是調(diào)用dos的時(shí)鐘,進(jìn)行的偽隨機(jī)函數(shù).
你也可以使用時(shí)鐘來(lái)模擬隨機(jī)函數(shù).
可以試用gettime這個(gè)函數(shù):
long int MyRand(int x)
{
struct time t1,t2,t3;
gettime(t1);
int y1=t1.ti_hund;//取1/100s作為基數(shù)
gettime(t2);
int y2=t2.ti_hund;//取1/100s作為基數(shù)
gettime(t3);
int y3=t3.ti_hund;//取1/100s作為基數(shù)
return y1*y2*y3;//產(chǎn)生的隨機(jī)數(shù)0~99*99*99
}