C语言中产生真随机数的方法,带封装
1.rand()函数众所周知,C语言提供的rand()函数,实际上是根据srand(seed)产生的一种映射关系,一种简单的写法是这样的:
srand(((unsigned)time(NULL));r=rand()%num;这里time()函数返回的是从1970.01.0100:00:00至今所经历的的秒数
2.弊端由于返回的是秒数,所以我们可以想到,需要一下子产生一堆随机数的时候,rand()函数就吃瘪了。计算机执行一条语句花费时间很短,所以返回的秒数几乎没有什么差别,同时,rand函数实质上是一种映射关系,对于确定的输入一定有一个不变的输出与之对应,所以,我们应该将随机的重点放在随机数种子的生成上
3.改进思路:人为控制seed变化unsignedintseed=0;//全局变量intrandNext(intleft,intright){seed++;srand(seed);returnrand()%(right-left+1)+left;}缺点:多次运行程序后会发现,产生了一样的结果再次改进:加入随机成分unsignedintseed=0;//全局变量intrandNext(intleft,intright){seed++;srand(time(NULL)+seed*seed);returnrand()%(right-left+1)+left;}缺点:暴露了一个全局变量seed再次改进:使用static封装//返回[left,right]的随机数intrandNext(intleft,intright){staticunsignedintseed=0;seed++;srand((unsigned)time(NULL)+seed*seed);returnrand()%(right-left+1)+left;}c语言产生随机数函数
c语言产生随机数函数rand()函数和srand()函数在头文件stdlib.h中rand()函数返回一个从0~32767之间的随机整数,为了生成区间[m,n]之间的整数,可以用公式rand()%(n-m+1)+m。例区间:[100,200],随机整数的计算方法为:rand()%(200-100+1)+100即rand()%101+100;
rand()函数是以种子(seed)为基准,以某个递推公式推算出来的一系列数(随机序列),但不是真正意义上的随机整数。当计算机开机后,这个种子的值就已经确认了,关机重启后种子的值也不会变。可以这样认为;一个种子对应范围内的一组随机数,种子改变随机数改变。例:sand()函数函数原型:voidsrand(inta)功能:初始化随机种子产生器,即将种子的值改为a。如果要产生随机种子,可以用srand(time(0));这个语句,其中time()函数是包含在头文件time.h中其功能是返回一个从1970.1.100.00.00到现在的秒数。因为每次运行的时间不同,因此产生的随机种子也不同,这样就保证运行时可以得到不同的随机序列。例:
如何利用C语言生成随机数
生成随机数有个库函数----rand,使用前需要引头文件----#include,rand函数参数为void无参,返回类型为int整形.
接下来我们来生成随机数看看
第一次生成随机数:
第二次生成随机数:
我们可以发现两次生成的随机数是一样的,所以说这种生成随机数的方法是不可行的.
我们可以看到rand返回的是从0到RAND_MAX之间的一个随机值
RAND_MAX的值是32767
所以说rand函数返回了一个从0-32767之间的一个数字,但是这个数字不够随机!
这里提到调用rand函数之前要先调用srand函数来设置随机数的生成器.
srand函数是设置一个随机的起点.
我们看到这时候生成的随机数就发生变化了,但是...
每次生成的随机数都是一样的,这样也达不到我们的目的
当srand()里的整数变化的时候,生成的随机数也会发生变化.
所以我们只有让括号里的数字是变化的,是个随机值,才可以得到不一样的随机数.
这时候可能有人有疑惑了,“我们现在需要生成个随机数,而你说这里得需要个随机数,那怎么给你啊”.
但是我们电脑的时间是一直在变化的,所以我们可以把时间传进去,这里的时间指的就是时间戳.
时间戳就是由时间转化成的一个数字
那么如何获取时间戳呢?
有个函数是time(),这个函数会返回一个时间戳,返回的时间戳是调用这个函数的这个时间点和计算机起始的时间之间的一个时间戳 ,time()函数是有参数的,但是这里我们不想用它的参数,所以可以传个空指针NULL进去,即time(NULL)
time_t也是是一个整形类型,只不过是结构体定义的类型
所以time函数返回的是个整形
而srand函数需要的是unsignedint类型的值
所以我们就把time函数强制类型转换成unsignedint类型
time函数需要的头文件是#include
另外,我们只需要把随机数的生成起点调用一次就可以了,所以说srand函数要放在主函数里面(还要放在rand函数前面),只调用一次,不要每次都调用
每次都调用的结果是----
生成的随机数离得很近.
注意:我们这时候得到的随机数是0-32767之间的数,若想得到1-100之间的数,只需要把得到的随机数%100+1就可以了.因为0-32767之间的数%100为0-99,再+1就是1-100了.
最终可以得到这样的效果~
c语言随机数生成1到100
问题描述编制100以内两个整数(随机产生)的加法运算练习程序。
分析变量四个整型变量:分别表示两个加数、两个和(计算机和人算结果)一个布尔变量(或整型也可):表示运算结果是否正确整型:表示题目总数量,答对题目数
库和函数C语言printf()输出函数scanf()输入函数rand()在“stdlib.h”中。每调用一次rand()函数,可以产生一个0-32767之间的随机数(2-2).一般情况下,要想得到[a,b]区间的随机数,可以使用表达式a+rand()%(b-a)srand()随机数种子,种子不同产生的随机数不同
pythonrandom()库(1)random():用来产生[0.0,1.0)之间的随机数(2)seed(a=None):初始化随机数种子(3)randint(a,b):随机产生一个[a,b]的整数time库(1)time():获取当前时间
源程序C语言#include#includeintmain(){inta,b,c1,c2,socres=0,num=0;while(1){a=rand()%100;//随机生成第一个加数b=rand()%100;//随机生成第二个加数c1=a+b;//正确的和num+=1;//题号//printf("num:%d",num);printf("%d.%d加%d等于?",num,a,b);scanf("%d",&c2);//用户输入的计算结果if(c2==c1){printf("你真棒,答对了!n");socres++;}elseprintf("哎呀,你答错了呢。正确答案是%dn",c1);printf("截止目前,您一共回答了%d道题目,答对了%d道题目,正确率为%.2f%%n",num,socres,(float)socres/num*100);}return0;}运行发现每次程序运行产生的随机数都是固定的,属于“伪随机随”。需要利用time.h引入一个种子,以保证每次播种产生的随机数是不同的。
http://c.biancheng.net/view/2043.html完善后的代码为:
#include#include#includeintmain(){inta,b,c1,c2,socres=0,num=0;while(1){srand((unsigned)time(NULL));//随机数种子a=rand()%100;//随机生成第一个加数b=rand()%100;//随机生成第二个加数c1=a+b;//正确的和num+=1;//题号//printf("num:%d",num);printf("%d.%d加%d等于?",num,a,b);scanf("%d",&c2);//用户输入的计算结果if(c2==c1){printf("你真棒,答对了!n");socres++;}elseprintf("哎呀,你答错了呢。正确答案是%dn",c1);printf("截止目前,您一共回答了%d道题目,答对了%d道题目,正确率为%.2f%%n",num,socres,(float)socres/num*100);}return0;}python#coding:gbkimportrandomimporttimenum,socres=0,0whileTrue:random.seed(time.time())#利用时间生成当前时间的随机数种子num+=1a=random.randint(0,99)#第一个加数b=random.randint(0,99)#第二个加数c1=a+b#正确的和c2=int(input("{}.{}+{}=?".format(num,a,b)))#格式化输入,用户的计算结果ifc2==c1:print("你真棒,答对了!")socres+=1else:print("哎呀,你答错了呢。正确答案是"+str(c1))print("截止目前,你一共回答了"+str(num)+"道题目,答对了"+str(socres)+"道题目,正确率为"+str(round(float(socres/num*100),2))+"%")#print("截止目前,您一共回答了{}道题目,答对了{}道题目,正确率为{}%".format(num,socres,round(float(socres/num*100),2)))#作用和上一行一样项目链接:https://www.yuque.com/wendellberry/codepractice
视频讲解:B站搜索“啥都想学的温德尔”
公众号:微信搜索“啥都想学的温德尔”
微信扫我更多精彩c语言生成1000 9999随机数,产生随机数(rand()函数和srand()函数)
有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数。
函数原型:intrand(void);
功能:返回一个[0,RAND_MAX]间的随机整数。其中RAND_MAX是定义在stdlib.h头文件中的一个常量。
注意:rand()函数包含在头文件stdlib.h中,要使用它必须用#include引入该头文件;
计算机实际上并没有真正做到产生一个随机数,只是在一串预先定义好的数据中选择一个返回给函数。
那么,如何得到一个在a到b的整数呢?有两种方法:
法一:
公式:a+rand()%(b-a+1)
示例:
n=1000+rand()%9000;//随机生成一个四位数返回给n。a+rand()%(b-a+1),四位数即1000-9999,此时a=1000,b=9999
法二:
公式:a+rand()*(b-a+1)/RAND_MAX
示例:
n=+rand()*/RAND_MAX;//随机生成一个四位数返回给n。a+rand()*(b-a+1)/RAND_MAX,四位数即1000-9999,此时a=1000,b=9999
当要产生多个随机数时,rand()会重复调用产生相同的数字序列。如果想要每次执行产生的随机数不同,就需要进行随机初始化。因此引入srand()函数。
函数原型:voidsrand(unsigneds