中易网

c语言,如何产生随机数

答案:1  悬赏:10  
解决时间 2021-03-29 06:35
c语言,如何产生随机数
最佳答案
srand((int)time(NULL));设定随机数种子rand()%100;产生0-99的随机数。高级点的,假如要产生16-59之间的数,你可以这样写:rand()%44+16(这里44由59-16+1得到)。其他情况如法炮制!下面是搜回来的:问题1: 怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。 专家解答: 之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。 问题2: 我按照上述方法并不能产生随机数,仅产生公差为3或4的等差数列: #include <stdlib.h> #include <iostream.h> #include <conio.h> #include <time.h> void main() { for(int i=0;i<100000;i++) { srand( (unsigned)time( NULL ) ); cout<<rand()<<endl; } } 专家解答: 你的程序是有问题的,你每产生一个随机数之前,都调用一次srand,而由于计算机运行很快,所以你每次用time得到的时间都是一样的(time的时间精度较低,只有55ms)。这样相当于使用同一个种子产生随机序列,所以产生的随机数总是相同的。你应该把srand放在循环外: srand( (unsigned)time( NULL ) ); for(int i=0;i<100000;i++) { //相关语句 }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
新婚姻法第三者生小孩构成重婚罪没有
现在上海味千拉面的兼职是多少钱一小时,KFC
南京幕府西路到岱山公墓怎么走?
我家的容声冰箱坏了,等维修点配件已经半个月
从长沙到贵阳的快递车一般跑多久
从深圳北到宝安区的松岗燕川蜜蜡批发市场怎么
买的苹果8p,26号到手激活,官网查到期是6号
自制桃罐头最正宗的做法
哪位帮帮忙给我写份故意伤害缓刑人员思想汇报
iPhone5的UC浏览器在哪里扫描二维码?
左眼皮跳是什么预兆周公解梦
龟息状态是指?
虎门哪里有什么好玩的地方?
烫脚全身出汗好吗
怎么样给宝宝补钙更科学?
推荐资讯
皮肤暗黄带有毛孔还有斑点适合哪种护肤品
什么是蓝调音乐?推荐几首代表作
餐饮环评,多久做一次
男人去除抬头纹
梦见房子起火了怎么回事!
好朋友新店开张送什么?
乌龟怎么快递出去,今天用圆通,被拆包看到乌
2011北京理工大学艺术类过了,文化课考多少能
江西最好的中学
恒大山水城怎么样
桃园居大酒店我想知道这个在什么地方
sin5x等于什么
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?