VC隨機(jī)函數(shù)srand和rand用法
前言:編程中經(jīng)常需要用到隨機(jī)數(shù),當(dāng)然程序(函數(shù))本身無法生成所謂的真實(shí)的隨機(jī)數(shù),還需要一個(gè)隨機(jī)種子,然后根據(jù)既定算法算出一個(gè)確定結(jié)果。如果我們只需要有限次或是隨機(jī)數(shù)時(shí)間要求間隔比較久的,也可直接使用當(dāng)前時(shí)間(時(shí)間戳)作為隨機(jī)數(shù)。既然時(shí)間可以作為隨機(jī)數(shù),那么為什么還需要專門的隨機(jī)函數(shù)呢?這就涉及到隨機(jī)序列的概率分布問題,通過專門設(shè)計(jì)的隨機(jī)函數(shù)可以保證連續(xù)隨機(jī)數(shù)序列盡量貼近一均勻合理的概率分布。而不能像開彩那樣,領(lǐng)導(dǎo)讓開幾就開幾,那樣重復(fù)概率太高了。
VC中隨機(jī)函數(shù)最常用就是srand和rand(實(shí)際上是屬于標(biāo)準(zhǔn)C函數(shù)),其中srand負(fù)責(zé)設(shè)置隨機(jī)種子,rand則負(fù)責(zé)生成隨機(jī)數(shù)。使用此二隨機(jī)函數(shù)需要包含<stdlib.h>頭文件。
一、srand和rand函數(shù)
1、srand函數(shù)
srand定義如下:void srand( unsigned int seed );
其中seed為無符號整數(shù),我們一般使用時(shí)間戳作為其參數(shù),取得時(shí)間戳,需要包含<time.h>頭文件。應(yīng)用示例參下文。
2、rand函數(shù)
rand()函數(shù)產(chǎn)生一個(gè)介于0~RAND_MAX之間的偽隨機(jī)整數(shù)(short型),RAND_MAX宏定義為0x7fff。如需要更大的隨機(jī)整數(shù),可使用多個(gè)隨機(jī)整數(shù)進(jìn)行組合運(yùn)算即可得到。
二、隨機(jī)數(shù)生成示例
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i,r;
srand( (unsigned)time( NULL ) );
for( i = 0;i < 10;i++ ) {
r=rand()%10;
printf( " %3d\n", r);
}
}
使用注意:
1、rand生成序列對于給定的srand種子來說,序列值組合是固定的
2、srand值在快速調(diào)用時(shí),time(NULL)可能不會更新,因?yàn)闀r(shí)間戳是以微秒計(jì)算的,所以微秒之內(nèi)的如果再次執(zhí)行srand和rand,則會得到相同的隨機(jī)值序列
3、每次設(shè)置隨機(jī)種子后,rand輸出會自動復(fù)位到第一個(gè)初始值,種子相同,則初值及后續(xù)的序列相同
示例如下:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int foo() {
int r;
srand( (unsigned)time( NULL ) );
r = rand()%100;
return r;
}
void main( void ) {
int i,r;
srand((unsigned)time(NULL));
for( i = 0; i < 10;i++ ) {
r=rand()%100;
printf( " %3d", r);
}
printf("\n");
for(i=0; i<10;i++) {
printf( " %3d", foo());
}
printf("\n");
}
輸出如下(可注意到第二行輸出完全相同):
76 69 10 95 37 85 25 99 4 33
76 76 76 76 76 76 76 76 76 76
參考資料:
http://msdn.microsoft.com/en-us/library/aa272944(v=vs.60).aspx
http://msdn.microsoft.com/en-us/library/aa272875(v=vs.60).aspx
相關(guān)文章
詳細(xì)分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象
這篇文章主要介紹了C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
C/C++淺析鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn)
這篇文章主要介紹了C/C++對于鄰接表拓?fù)渑判蛩惴ǖ膶?shí)現(xiàn),鄰接表是圖的一種鏈?zhǔn)酱鎯Ψ椒?,其?shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)2022-07-07
C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例幫助大家實(shí)現(xiàn)改功能,需要的朋友可以參考下2017-08-08
C語言詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對齊規(guī)則
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊2022-07-07

