用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
- 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的情况,如此类推。