用C语言的rand()和srand()产生伪随机数的方法总结
浅析C语言中的rand函数和srand函数(一)
浅析C语⾔中的rand函数和srand函数(⼀)我们在编程实现算法的过程中,往往需要使⽤到随机数。
由于计算机是⼀台以逻辑为基础的机器,没法做到真正的随机(⼤概量⼦计算机可以?)。
所以计算机⽣成的是伪随机数,供我们使⽤。
我们使⽤C语⾔的rand函数,⽣成的也是伪随机数。
⼀个简单的⽰范如下:1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>45int6 main(int argc, char** argv)7 {8// 以机器当前的时间来构造⽣成伪随机数的"种⼦" 。
9 srand((unsigned int)time(NULL));10int i;11// 打印10个伪随机数12for (i = 0; i < 10; i++) {1314 printf("%d ", rand());15 }16 printf("\n");1718 system("pause");19return0;20 }很显然,如果不使⽤第九⾏的srand函数,那么我们的程序每次打印的10个伪随机数序列是⼀样的,在本机上始终是41, 18467, 6334, ......。
这是由于C语⾔是利⽤linear congruential generator作为⽣成器来⽣成伪随机数,但是这个⽣成器⽣成伪随机数,需要⼀个“种⼦”来进⾏运算。
⽽如果我们仅仅调⽤rand函数,那么我们始终使⽤的是C语⾔⾃⼰设置的固定的“种⼦”来⽣成伪随机数,所以⽣成的伪随机数的序列肯定是⼀模⼀样的咯。
当我们使⽤srand,以时间为参数,为rand提供⼀个不⼀样的“种⼦”,那么由于每次的“种⼦”都不⼀样,当然每次的伪随机数的序列都不⼀样。
但是从代码实现中,我们不能清楚地看出来srand函数提供的“种⼦”如何就被rand函数⽤上了。
有关rand(),srand()产生随机数学习总结
有关rand(),srand()产⽣随机数学习总结要计算机产⽣⼀个随机数不像扔⾊⼦⼀样,计算机的每⼀步操作,就是执⾏⼀堆代码,这些代码是事先安排好的,所以计算机的产⽣⾏为是不具有随机性和预测性的(当然这⾥说的是现阶段的计算机体系,到未来的计算机的体系,未知),所以计算机产⽣的随机数都不是真正意义上的随机数,只是伪随机数,他以⼀个真值(也称为种⼦)作为初始条件,然后⽤⼀定的算法不停迭代产⽣随机数。
库函数中系统提供了两个函数⽤于产⽣随机数:srand()和rand();rand函数:头⽂件<stdlib.h>定义函数:int rand(void),函数功能:产⽣随机数,函数说明:因为rand的内部是⽤线性同余法做的,不是真的随机数,只不过因为其周期特别长,所以在⼀定范围内可以看成是随机的,rand()会返回⼀随机值,范围在0到RAND_MAX间,在调⽤此函数产⽣随机数前,必须利⽤srand()设好随机数种⼦,若没有设随机数种⼦,rand()在调⽤时会⾃动设随机数种⼦为1。
返回值:返回0到RAND_MAX之间的整数值,RAND_MAX的范围最少在32767之间(int),即双字节(16位)。
若unsigned int双字节是65535,且0-RAND_MAX每个数字被选中的随机率是相同的。
rand()产⽣的是假随机数,每次执⾏时是相同的,若要不同以不同的值来初始化,初始化的函数就是srand()。
srand函数:头⽂件 <stdlib.h> ,定义函数:void srand(unsigned int seed);函数声明:srand()⽤来设置rand()产⽣随机数时的随机数种⼦,参数seed必须是整数,通常可以⽤time(0)的返回值作为seed.如果每次seed都设置相同的值,rand()产⽣的随机数值每次都⼀样。
srand(unsigned)time(NULL))使⽤系统定时/计数器的值作为随机种⼦每个种⼦对应⼀组根据算法预先⽣成的随机数,所以在相同平台的环境下,不同时间产⽣的随机数是不同的,相应的若将srand(unsigned)tima(NULL)改为任⼀常量,则⽆论何时运⾏,运⾏多少次得到的随机数都是⼀组特定的序列,所以srand⽣成的随机数是伪随机数。
C语言如何发生随机数
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,通系电1,力过根保管据护线生高0不产中仅工资2艺料22高试2可中卷以资配解料置决试技吊卷术顶要是层求指配,机置对组不电在规气进范设行高备继中进电资行保料空护试载高卷与中问带资题负料2荷试2,下卷而高总且中体可资配保料置障试时2卷,32调需3各控要类试在管验最路;大习对限题设度到备内位进来。行确在调保管整机路使组敷其高设在中过正资程常料1工试中况卷,下安要与全加过,强度并看工且25作尽52下可22都能护可地1关以缩于正小管常故路工障高作高中;中资对资料于料试继试卷电卷连保破接护坏管进范口行围处整,理核或高对者中定对资值某料,些试审异卷核常弯与高扁校中度对资固图料定纸试盒,卷位编工置写况.复进保杂行护设自层备动防与处腐装理跨置,接高尤地中其线资要弯料避曲试免半卷错径调误标试高方中等案资,,料要编试求5写、卷技重电保术要气护交设设装底备备置。4高调、动管中试电作线资高气,敷料中课并设3试资件且、技卷料中拒管术试试调绝路中验卷试动敷包方技作设含案术,技线以来术槽及避、系免管统不架启必等动要多方高项案中方;资式对料,整试为套卷解启突决动然高过停中程机语中。文高因电中此气资,课料电件试力中卷高管电中壁气资薄设料、备试接进卷口行保不调护严试装等工置问作调题并试,且技合进术理行,利过要用关求管运电线行力敷高保设中护技资装术料置。试做线卷到缆技准敷术确设指灵原导活则。。:对对在于于分调差线试动盒过保处程护,中装当高置不中高同资中电料资压试料回卷试路技卷交术调叉问试时题技,,术应作是采为指用调发金试电属人机隔员一板,变进需压行要器隔在组开事在处前发理掌生;握内同图部一纸故线资障槽料时内、,设需强备要电制进回造行路厂外须家部同出电时具源切高高断中中习资资题料料电试试源卷卷,试切线验除缆报从敷告而设与采完相用毕关高,技中要术资进资料行料试检,卷查并主和且要检了保测解护处现装理场置。设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
C语言如何产生随机数-推荐下载
举个例子,假设我们要取得 0~10 之间的随机整数(不含 10 本身): 大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我 会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
printf("%d ", rand()%10); }
该程序每次运行结果都不一样,因为每次启动程序的时间都不同。另外需要 注意的是,使用 time()函数前必须包含头文件 time.h。
3. 注意事项 求一定范围内的随机数。
如要取[0,10)之间的随机整数,需将 rand()的返回值与 10 求模。
“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样 发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数, 即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的 伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一 定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部 分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了 事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共 性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产 生伪随机数而不能产生绝对随机的随机数。
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
c语言生成随机数
c语言生成随机数在编写程序过程中,我们往往需要计算机替我们生成一系列随机数,特别是使用蒙特卡洛大样本仿真方法时,随机数是否随机往往决定着结果是否精确。
但计算机是通过设置好的一系列程序来运行的,并不能完整模拟随机的概率过程,“随机数”往往稍不注意就变成了“确定数”。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int main (void){ int a = rand();printf("%d\n", a);system("pause");return0;}可以看到,无论多少次运行程序,得到的“随机数”永远都是41。
这是因为rand()函数产生的是“伪随机数”,是按照提前设计好的程序以某一个“种子”为起点开始递推产生的一个序列。
默认初始化的种子为“1”int a;srand(1);a = rand();printf("%d\n",a); //41#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int main (void){ srand(2);int a = rand();printf("%d\n", a);system("pause");return0;}当初始化了“种子”为2后,“随机数”变为了“确定数”45。
一、srand()和rand()函数rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。
默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。
随机函数使用方法
1.rand()与srand()在C语言函数库中包含了一个产生随机数的函数:int rand( );返回的是一个界于0~32767之间的伪随机数,包括0和32767。
注意,这里产生的是伪随机数,不是真正意义上的随机数,看下面的程序:#include "stdlib.h"#include "stdio.h"void main( void ){printf( " %6d\n", rand() );getchar();}程序运行的结果是:346多次运行这个程序,发现每次产生的结果都是346(不同的机器可能产生的结果不一样),这就是所谓的伪随机数。
伪随机数是通过一个公式来运算出来的,所以,每次产生的伪随机数都一样。
那么,如何才能产生真正意义上的随机数呢?这就有一个随机种子的问题。
在C 语言标准函数库中,有另一个配套函数:void srand( unsigned int seed );所以,要产生真正意义上的随机数,那么就要求每次提供的种子不一样,一般情况下,都设置时间为随机函数的种子。
看下面的一段程序:#include "stdlib.h"#include "stdio.h"#include "time.h"void main( void ){int i;srand( (unsigned)time( NULL ) );printf( “ %6d\n”, rand() );}Output6929802621987307342058766992203425051798810104每次运行这个程序,产生的随机数都不一样,这样就达到了随机数的要求了2.random与randomize()打开标准库中的头文件stdlib.h 就会发现有这样的一条语句:#define random(num) (rand() % (num))可见要产生给定范围的随机数,可以使用random()。
C语言中srand(), rand(), time()函数
C语言中srand(), rand(), time()函数srand函数srand函数是随机数发生器的初始化函数。
原型:void srand(unsigned seed);用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子,后面的rand() 函数会出现一样的随机数。
如:srand(1); 直接使用1来初始化种子。
不过为了防止随机数每次重复常常使用系统时间来初始化,即使用time函数来获得系统时间,它的返回值为从00:00:00 GMT, January 1, 1970 到现在所持续的秒数(即从1970年1月1日的00:00:00到当前你所处的时间所经过的秒数),然后将time_t型数据转化为(unsigned)型再传给srand函数,即:srand((unsigned) time(&t));还有一个经常用法,不需要定义time_t型t变量,即:srand((unsigned)time(NULL));直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。
srand((int)getpid()); 使用程序的ID(getpid())来作为初始化种子,在同一个程序中这个种子是固定的。
例1(C语言)随机输出十个0-100之间的整数程序例1:#include <stdlib.h> /*用到了srand函数,所以要有这个头文件*/#include <stdio.h>#include <time.h> /*用到了time函数,所以要有这个头文件*/#define MAX 10int main( void){int number[MAX] = {0};int i;unsigned int seed;scanf("%d",&seed);/*手动输入种子*/srand(seed);for(i = 0; i < MAX; i++){number[i] = rand() % 100; /*产生100以内的随机整数*/printf("%d ", number[i]);}printf("\n");return 0;}例2(C语言)程序例2:#include <stdlib.h>#include <stdio.h>#include <time.h> /*用到了time函数,所以要有这个头文件*/#define MAX 10int main( void){int number[MAX] = {0};int i;srand((unsigned) time(NULL)); /*播种子*/for(i = 0; i < MAX; i++){number[i] = rand() % 100; /*产生100以内的随机整数*/printf("%d ", number[i]);}printf("\n");return 0;}例3(C++)#include <iostream>#include <ctime>#include <cstdlib>using namespace std;int main(){double random(double,double);srand(unsigned(time(0)));for (int icnt = 0; icnt != 10; ++icnt){cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;}return 0;}double random(double start, double end){return start+(end-start)*rand()/(RAND_MAX+ 1.0);}在VC++6.0中输出的结果是:==========================================No.1: 6No.2: 3No.3: 8No.4: 7No.5: 0No.6: 8No.7: 4No.8: 8No.9: 7No.10: 9==========================================rand函数简介功能::伪随机数发生器所属库:stdlib.h用法:需要先调用srand初始化,一般用当前日历时间初始化随机数种子,这样每行代码都可以产生不同的随机数。
srand和rand用法
这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随 机数生成器。请试着使用高位比特,具体请参考本文第 1 点。
4 产生 0~1 的随机数 rand()/(RAND_MAX+0.0)
()函数时一样的,也就是说 rand()函数默认情况下初始化种子值为 1;
Байду номын сангаас
在 stdlib.h 中这两个函数的原型是: int rand(); void srand (unsigned int); srand(time(0)); i=rand(); 这样 i 就是一个真正意义上的随机数。
原因
rand()产生伪随机数,srand 函数提供种子,种子不同产生的随机数序列也不同, 所以通常先调用 srand 函数 time(0)返回的是系统的时间(从 1970.1.1 午夜算起), 单位:秒,种子不同当然产生的随机数相同几率就很小了。
5 产生 x~y 的随机数(y>x) rand()%(y-x+1)+x
例程
文件名: rand_srand.c /* This program generates and prints ten random integers betwee
n 1 and RAND_MAX*/ #include <stdio.h> #include <stdlib.h> int main() { unsigned int seed; /*申明初始化器的种子,注意是 unsigned int 型的*/ int k; printf("Enter a positive integer seed value: \n"); scanf("%u",&seed); srand(seed); printf("Random Numbers are:\n"); for(k = 1; k <= 10; k++) { printf("%i",rand()); printf("\n"); } return 0; } 当提供的种子相同时,随机数序列也时相同的。而且当种子为 1 时,与不使用 srand
C 随机函数rand()与srand()的用法
}
}
总结:
我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a) 功能是
原形是void randomize(),功能是用来始初rand() 的种子的初始值,而且该值是不确定的,它相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h罢了。
printf("范例比较
5 8 8 8 10 2 10 8 9 9
2 9 7 4 10 3 2 10 8 7
又或:
用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,比较好的做法是: j=(int)(n*rand()/(RAND_MAX 1.0))产生一个0到n之间的随机数
范例
/* 产生介于1 到10 间的随机数值,此范例与执行结果可与rand()参照*/
#include
#include
main()
{
int i,j;
srand((int)time(0));
for(i=0;i<10;i )
{
j=1 (int)(10.0*rand()/(RAND_MAX 1.0));
用C语言的rand和srand产生伪随机数的方法总结
用C语言的rand和srand产生伪随机数的方法总结第一篇:用C语言的rand和srand产生伪随机数的方法总结标准库(被包含于中)提供两个帮助生成伪随机数的函数:函数一:int rand(void);从srand(seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
根据上面的第一点我们可以得出:1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX (0x7fff))之间的一个随机取得的值。
3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
举几个例子,假设我们要取得0~6之间的随机整数(不含6本身):例一,不指定seed: for(int i=0;i<10;i++){ ran_num=rand()% 6;cout< //…srand((unsigned)time(0));for(inti=0;i<10;i++){ ran_num=rand()% 6;cout<time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
C语言如何产生随机数
C语言如何产生随机数1. 基本函数2. 使用方法rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。
RAND_MAX常量被定义在stdlib.h头文件中。
其值等于32767,或者更大。
srand()函数使用自变量n作为种子,用来初始化随机数产生器。
只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。
因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。
如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。
每次运行都将输出:1 7 4 0 9 4 8 8 2 4每次运行都将输出:1 7 4 0 9 4 8 8 2 4例2的输出结果与例1是完全一样的。
每次运行都将输出:4 0 1 3 5 3 7 7 1 5该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。
该程序每次运行结果都不一样,因为每次启动程序的时间都不同。
另外需要注意的是,使用time()函数前必须包含头文件time.h。
3. 注意事项求一定范围内的随机数。
如要取[0,10)之间的随机整数,需将rand()的返回值与10求模。
那么,如果取的值不是从0开始呢?你只需要记住一个通用的公式。
要取[a,b)之间的随机整数(包括a,但不包括b),使用:(rand() % (b - a)) + a伪随机浮点数。
要取得0~1之间的浮点数,可以用:rand() / (double)(RAND_MAX)如果想取更大范围的随机浮点数,比如0~100,可以采用如下方法:rand() /((double)(RAND_MAX)/100)其他情况,以此类推,这里不作详细说明。
当然,本文取伪随机浮点数的方法只是用来说明函数的使用办法,你可以采用更好的方法来实现。
举个例子,假设我们要取得0~10之间的随机整数(不含10本身):大家可能很多次讨论过随机数在计算机中怎样产生的问题,在这篇文章中,我会对这个问题进行更深入的探讨,阐述我对这个问题的理解。
C++随机数(rand和srand)函数用法详解
C++随机数(rand和srand)函数⽤法详解c++随机数C++ 提供了⼀组函数以⽣成和使⽤随机数字。
随机数字就是从⼀组可能的值中进⾏随机选择⽽获得的⼀个值。
该组中的值都有相同的被选中的⼏率。
C++ 库有⼀个名为 rand() 的函数,每次调⽤该函数都将返回⼀个⾮负整数。
要使⽤ rand() 函数,必须在程序中包含 cstdlib 头⽂件。
以下是其⽤法⽰例:randomNum = rand();但是,该函数返回的数字其实是伪随机数。
这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是⽤算法⽣成的。
该算法需要⼀个起始值,称为种⼦,以⽣成数字。
如果没有给出⼀个种⼦,那么它将在每次运⾏时产⽣相同的数字流。
下⾯的程序说明了这⼀点://This program demonstrates what happens in C++ if you// try to generate random numbers without setting a "seed".#include <iostream>#include <cstdlib>// Header file needed to use randusing namespace std;int main(){// Generate and printthree random numberscout << rand() << " ";cout << rand() << " ";cout << rand() << endl ;return 0;}第1次运⾏输出结果:41 18467 6334第2次运⾏输出结果:41 18467 6334要在每次运⾏程序时获得不同的随机数字流,则必须为随机数⽣成器提供⼀个种⼦以开始。
VC随机数生成方法
如果仅是这样,会发现重启程序后,产生的随机数还是没有改变。这是因为每次都用 12 来初始化随机数
种子,每次产生的种子都是一样的,所以也产生相同的随机数。
为了使每次 srand 函数的参数不同,可以用 time()函数的返回值来作为 srand()的参数。
time 函数:
time_t time(time_t *t);
函数中)
void CRandTestDlg::OnButton1() {
char cTemp[8];
m_sRands="";
for (int y=0;y<5;y++) {
for (int x=0;x<10;x++) {
m_iaRands[x][y]=rand();
memset(cTemp,0,sizeof(cTemp)); //初始化数组
钮产生的随机数和上次启动程序后产生的随机数。这就是我们叫这个函数产生的是伪随机数的原因。因
为初始化这个随机数发生器的种子是在编译的时候就确定的,所以每次启动程序参数的随机数都相同。
srand 函数
void srand(unsigned int seed);
srand 函数是用来初始化随机数发生器种子的,这个函数在程序中单独使用没有意义,必须和 rand()配
合使用。此函数有一个 unsigned int 的参数,就是用这个参数来生成一个随机数种子。见如下示例代码
void CRandTestDlg::OnButton2()
{
char
cTemp[8]={'\0'};
if (!m_bFlag){
//用一个 bool 变量来保证只初始化一次
c语言随机函数
c语言随机函数C语言中的随机函数是一个非常有用的工具,它可以用来生成随机数。
随机数在许多应用中都有广泛的应用,例如游戏开发、密码学、模拟等等。
在本篇文章中,我们将深入讨论C语言中的随机函数,并探讨一些与随机函数相关的重要概念。
首先,我们需要了解如何在C语言中使用随机函数。
C语言提供了一个内置的随机函数rand(,它可以生成一个范围在0到RAND_MAX之间的伪随机整数。
要使用rand(函数,我们需要包含头文件<stdlib.h>,该头文件中包含了rand(函数的声明。
下面是一个简单的示例,演示了如何使用rand(函数生成随机数:```c#include <stdio.h>#include <stdlib.h>int mainint i, randomNum;for(i = 0; i < 10; i++)randomNum = rand(; // 生成随机数printf("%d\n", randomNum);}return 0;```注意,由于rand(函数的返回值范围在0到RAND_MAX之间,我们可以使用取模运算来生成特定范围内的随机数。
例如,要生成0到9之间的随机整数,我们可以使用rand( % 10。
另一个与随机函数相关的重要概念是随机数种子。
随机数种子是一个整数,它用于指定随机数生成的起始点。
如果我们不提供随机数种子,那么每次程序执行时都会生成相同的随机数序列。
在实际应用中,我们可能会遇到需要生成特定范围内的随机数的情况。
为了做到这一点,我们可以使用取模运算符(%)。
例如,要生成0到9之间的随机整数,我们可以使用rand( % 10。
需要注意的是,这种方法可能会导致一些数值上的偏差,因为一些值可能会比其他值出现得更频繁。
随机数在许多应用中都有广泛的应用。
在游戏开发中,我们可以使用随机数来生成游戏场景、敌人位置等。
在密码学领域,例如生成随机密钥的过程中,我们需要使用高质量的随机数。
C语言中产生随机数的方法
C语言中产生随机数的方法在C语言中,可以使用多种方法产生随机数。
下面将介绍三种常用的方法:使用rand函数、使用srand函数、使用时间戳作为种子。
1. 使用rand函数:rand函数是C标准库中用于产生伪随机数的函数,其返回一个介于0至RAND_MAX之间的随机整数。
使用rand函数需要包含stdlib.h头文件。
```#include <stdio.h>#include <stdlib.h>int maiint i, n;printf("输入一个整数:");scanf("%d", &n);//产生n个随机数for (i = 0; i < n; i++)printf("%d\n", rand();}return 0;```2. 使用srand函数:srand函数用于设置rand函数的种子,通过设置不同的种子可以获取不同的随机数序列。
使用srand函数需要包含stdlib.h头文件。
```#include <stdio.h>#include <stdlib.h>int maiint i, n;printf("输入一个整数:");scanf("%d", &n);//设置种子为当前时间//产生n个随机数for (i = 0; i < n; i++)printf("%d\n", rand();}return 0;```3.使用时间戳作为种子:```#include <stdio.h>#include <stdlib.h>int maiint i, n;printf("输入一个整数:");scanf("%d", &n);//获取当前时间的时间戳//产生n个随机数for (i = 0; i < n; i++)printf("%d\n", rand();}return 0;```以上就是在C语言中产生随机数的三种常用方法。
c语言随机函数的使用
在C语言函数库中包含了一个产生随机数的函数:int rand( void );在函数库中对这个函数的说明是:The rand function returns a pseudorandom integer in the range0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.而在C语言函数库中是这样定义RAND_MAX的:/* Maximum value returned by "rand" function*/#define RAND_MAX 0x7FFF所以,函数int rand( void );返回的是一个界于0~32767(0x7FFF)之间的伪随机数,包括0和32767。
注意,这里产生的是伪随机数,不是真正意义上的随机数,看下面的程序:#include "stdlib.h"#include "stdio.h"void main( void ){/* Display a number. */printf( " %6d\n", rand() );getchar();}程序运行的结果是:346多次运行这个程序,发现每次产生的结果都是346(不同的机器可能产生的结果不一样),这就是所谓的伪随机数。
伪随机数是通过一个公式来运算出来的,所以,每次产生的伪随机数都一样。
那么,如何才能产生真正意义上的随机数呢?这就有一个随机种子的问题。
在C语言标准函数库中,有这么一个函数:void srand( unsigned int seed );在《The c programming language》中对这个函数是这样描述的:srand uses seed(函数变量声明中的seed) as the seed(随机函数中种子的意思)for a new sequence of pseudo-random numbers. Theinitial seed is 1.所以,要产生真正意义上的随机数,那么就要求每次提供的种子不一样,一般情况下,都设置时间为随机函数的种子。
C语言中用于产生随机数的函数使用方法总结
C语⾔中⽤于产⽣随机数的函数使⽤⽅法总结在UNIX操作系统和window的操作系统上,我们知道有⼀个函数rand,它就是⽤来产⽣随机数的函数API接⼝,那么它的原理如何实现?如果约定a1=f(seed),an+1=f(an),那么可以得到⼀个序列a1,a2,a3..an,那么要制作⼀个伪随机函数rand,只需要让它每调⽤⼀次就返回序列的下⼀个元素就⾏。
其实就是相当于第1次调⽤rand返回a1,第2次返回a2,…,第n次返回an,这样每次返回的数值都不⼀样,也就是相当于随机数了。
但是其实不是真正的随机数,真正的随机数是使⽤物理现象产⽣的:⽐如掷钱币、骰⼦、转轮、使⽤电⼦元件的噪⾳、核裂变等等。
这样的随机数发⽣器叫做物理性随机数发⽣器,它们的缺点是技术要求⽐较⾼。
那到底什么是随机数呢?随机数:随机数就是每次运⾏代码的时候随机产⽣的数,每次产⽣的数的值是⽆法确定的,返回 0 到 RANDMAX 之间的随机整数值,不包含 RANDMAX 的值,RANDMAX 的范围最少是在32767之间(int),即双字节(16位数)。
若⽤ unsigned int 双字节是65535,四字节是4294967295的整数范围。
⽽且 0 到 RANDMAX 每个数字被选中的概率是相同的。
原理:产⽣随机数的原理是根据⼀个值,⼀般称为随机种⼦,然后把这个种⼦作为参数,经过⼀系列的公式运算产⽣出⼀个值,这个值就是随机数。
在 C 语⾔当中使⽤随机数要⽤到 rand 函数和 srand 函数,int rand():返回值为随机值,参数为空,通过 rand 函数就会产⽣⼀个随机数。
void srand(unsigned int seed):返回值为空,就是设置随机种⼦的,当我们不设置随机种⼦的时候,默认设置的种⼦为 1,也就是srand(1)。
使⽤:#include<stdlib.h>//得引⼊ stdlib.h 这个头⽂件int main(){int rand_num = rand();printf("rand_num = %d\n", rand_num);return 0;}每次运⾏的结果都⼀样,这是为什么呢?上⾯已经说了,随机数产⽣的是有⼀个随机种⼦作为参数,然后返回⼀个值,⽽且默认的随机种⼦为1,所以每次产⽣的随机数都⼀样。
C语言随机函数总结
C语言随机函数总结2007年02月12日星期一 13:28(1) rand()函数:原型: int rand(void)功能: 产生从0到RAND_MAX(0x7fff)之间的随机数。
头文件: stdlib.h例:#include <stdio.h>#include <stdlib.h>int main(){int k;k = rand();printf("%d\n", k);return 0;}编译运行,发现它的确产生随机数了,但是,每次运行程序产生的随机数都是一样的,为什么呢?因为随机数取在C语言中采用的是固定序列,所以每次执行所取的是同一个数。
那么如何写一个程序,让它每次运行时产生的随机数都不一样呢?往下看:(2)srand()函数:原型: void srand(unsigned seed)功能: 产生随机数的起始发生数据,和rand函数配合使用头文件: stdlib.h time.h例:#include <stdio.h>#include <stdlib.h>#include <time.h>int main(void){int i;time_t t;srand((unsigned) time(&t));printf("Ten random numbers from 0 to 99\n\n");for (i=0; i<10; i++)printf("%d\n", rand()%100);return 0;}这时运行程序,会发现每次产生的随机数都不一样。
这是因为这里采用了时间作为种子,而时间在每时每刻都不相同,所以就产生了"随机"的随机数了。
所以,要想产生不同的随机数,在使用rand之前需要先调用srand。
这样做相当麻烦,有没一个更简单的函数呢?往下看:(3)randomize()函数:原型: int randomize(void)功能: 通过time函数来得到一个随机数头文件: stdlib.h time.h该函数就相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h。
CC++生成随机数
CC++⽣成随机数⼀、rand和srand 在C++11标准出来之前,C/C++都依赖于stdlib.h头⽂件的rand或者srand来⽣成随机数。
其不是真正的随机数,是⼀个伪随机数,是根据⼀个数(我们可以称它为种⼦)为基准以某个递推公式推算出来的⼀系列数,当这系列数很⼤的时候,就符合正态公布,从⽽相当于产⽣了随机数,但这不是真正的随机数,当计算机正常开机后,这个种⼦的值是定了的,除⾮你破坏了系统。
rand:内部是线性同余实现的,因为周期较长,所以在⼀定的范围内可看成随机的。
系统默认随机种⼦是1。
rand()返回⼀随机数值的范围在0⾄RAND_MAX 间。
RAND_MAX的范围最少是在32767之间(int)。
⽤unsigned int 双字节是65535,四字节是4294967295的整数范围。
0~RAND_MAX每个数字被选中的机率是相同的。
//函数声明int rand(void);srand:srand()⽤来设置rand()产⽣随机数时的随机数种⼦。
参数seed必须是个整数,如果每次seed都设相同值,rand()所产⽣的随机数值每次就会⼀样。
//函数声明void srand(unsigned int seed);常见⽤法如下:(rand() % (b - a)) + a ,⽣成[a, b) 的随机整数(rand() % (b - a + 1)) + a ,⽣成[a,b] 的随机整数rand() / double(RAND_MAX) ,⽣成0~1之间的浮点数来个测试代码:#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;int main(){srand((unsigned)time(NULL));for(int i = 0; i < 10;i++ )cout << rand() << '\t';cout << endl;return 0;}⼆、新标准随机数 有时候程序员需要⼀些⾮均匀分布的数,这时候rand就显得不是那么好⽤,新标准很好解决了这个问题:随机数引擎类和随机数分布类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:
函数一:int rand(void);
从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。
函数二:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:
1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
根据上面的第一点我们可以得出:
1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。
2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。
3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。
举几个例子,假设我们要取得0~6之间的随机整数(不含6本身):
例一,不指定seed:
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次运行都将输出:5 5 4 4 5 4 0 0 4 2
例二,指定seed为定值1:
srand(1);
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次运行都将输出:5 5 4 4 5 4 0 0 4 2
跟例子一的结果完全一样。
例三,指定seed为定值6:
srand(6);
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次运行都将输出:4 1 5 1 4 3 4 4 2 2
随机值也是在[0,6)之间,随得的值跟srand(1)不同,但是每次运行的结果都相同。
例四,指定seed为当前系统流逝了的时间(单位为秒):time_t time(0):
#include <ctime>
//…
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
第一次运行时输出:0 1 5 4 5 0 2 3 4 2
第二次:3 2 3 0 3 5 5 2 2 3
总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1秒?,见下)。
关于time_t time(0):
time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
比如假设输出:
cout<<time(0);
值约为1169174701,约等于37(年)乘365(天)乘24(小时)乘3600(秒)(月日没算)。
另外,关于ran_num = rand() % 6,
将rand()的返回值与6求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则rand()的返回值本身可能是很巨大的。
一个通用的公式是:
要取得[a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a不含b)。
在a为0的情况下,简写为rand() % b。
最后,关于伪随机浮点数:
用rand() / double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout<<ran_numf<<" ";
}
运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如1~10,可以将
rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。