C++c 随机数生成代码代码

&>&用C++写的随机数生成器(含源代码)
用C++写的随机数生成器(含源代码)
上传大小:1.4MB
语言用的是C++ ;
开发工具用的是DEV-C;
可指定随机数范围和生成个数;
综合评分:4(9位用户评分)
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有9条
就这个还拿出来忽悠人...........
这个是自己写的还是系统源代码中自带的额
挺好用的,对我有帮助
上传者:deltatang
上传时间:积分/C币:10
上传者:luozhuang
上传时间:积分/C币:3
上传者:luorunlong
上传时间:积分/C币:5
上传时间:积分/C币:0
上传者:xiemin198403
上传时间:积分/C币:3
上传者:liufangbaishi2014
上传时间:积分/C币:5
上传者:NoctisCaelum
上传时间:积分/C币:3
上传者:mencyou
上传时间:积分/C币:0
上传者:maxin151
上传时间:积分/C币:3
上传者:sjyhehe
上传时间:积分/C币:3
上传者:shanxiuwei
上传时间:积分/C币:3
上传者:ice9696
上传时间:积分/C币:3
上传者:mengxiang0869
上传时间:积分/C币:3
上传者:tly329
上传时间:积分/C币:3
上传者:UFOylzj
上传时间:积分/C币:3
上传者:xudaohong
上传时间:积分/C币:3
审核通过送C币
C++语言程序设计
创建者:weixin_
现代C++精品资料
创建者:vanmit
软件工程毕业设计之基于MFC的手机生产制造执行系统的设计与开发
上传者其他资源上传者专辑
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
扫码关注并点击右下角获取下载码
输入下载码
为了良好体验,不建议使用迅雷下载
用C++写的随机数生成器(含源代码)
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励5下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
用C++写的随机数生成器(含源代码)C++编写生成不重复的随机数代码
投稿:hebedich
字体:[ ] 类型:转载 时间:
本文给大家汇总介绍了3种c++实现生成不重复的随机数的函数,十分的简单实用,有需要的小伙伴可以参考下。
C++编写生成不重复的随机数代码
vector&int& getRandom(int total)
srand((int)time(NULL));
std::vector&int& input = *new std::vector&int&();
for (int i = 0; i & i++) {
input.push_back(i);
vector&int& output = *new vector&int&();
for (int i = 0; i & i++) {
vector&int&::iterator iter = input.begin();
int num = random()%
iter = iter+
output.push_back(*iter);
input.erase(iter);
再来一例:
void permutation(int n, int *z_array)
int i, j, k,
int buffer[N];
/* 初始化数组 */
for (i=0; i&n; i++)
buffer[i]=0;
/* 准备生成随机数,以当前时间为种子 */
srand((unsigned)time((long *)0));
/* 获得不重复的随机数据 */
for (i=0; i&n; i++) {
/* 获得0~(n-i)的随机数据 */
z = rand()%(n-i);
while (j&=z) {
if (buffer[j+k]==0) j++;
buffer[j+k-1]=1;
z_array[i]=j+k-1;
方法三:来个复杂点的
#include&stdio.h&
#include &time.h&
#include "iostream"
#include &math.h&
#define N 53
//print array
void display(int *a)
for (int i =0;i&N;i++)
cout&&" "&&a[i]&&" ";
int main(void)
int b[N],a[N];
for (int i =0;i&N;i++)
b[i] = i+1;
// random(a);
srand((unsigned)time(NULL));
int MaxIndex = N;
for ( i= 0;i&N;i++)
int index = (int)rand()%MaxI//随机一个 0 - 52的index
a[i] = b[index];
//随机到的数字给a[i],i from 0 to N-1
b[index] = b[MaxIndex-1];
MaxIndex--;
display(a);
以上3种方法均可实现生成不重复的随机数,具体的效率如何,小伙伴们自己测试下吧。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具相关文章推荐
一、文件的读写
如前面所提,流的读写主要有>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 istream,故操作函数都是一...
int main()
freopen("...
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结:
这里主要是讨论fstream...
一、文件打开的方式和默认选项
// 附加到末尾,原来的数据不变
ios::app Opens an output file for appending.
// 文件打开后定位到文件尾,ios:app...
srand()以及rand()函数用法
转自:http://blog.csdn.net/zqy2000zqy/article/details/1174978
结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中。不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的。 一、若类和结构体所有数...
4、阅读并运行下面的示例,体会二进制文件和字符串流操作的一般方法。
struct stude...
2、查看下面程序的输出,解释为什么会有这样的输出。
int main( )
unsigned char ...
返回:贺老师课程教学链接1、阅读并运行下面的两个程序,分别用记事本和二进制文件阅读器(请自行下载Binary Viewer等程序,或者用DOS中的Debug程序,并百度其用法)。查看其内容,并理解文件...
C学习网:链接->C学习网
C训练网:链接->C训练网
前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。但在实际开发中经常需要读写文件的中间部分,要解决这个问题,...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)&&&&i&=&7&*&(rand7()&-&1)&+&rand7();&&//&it&is&now&uniformly&random&between&1&and&49
}&while(i&&&40); & & &//&it&is&now&uniformly&random&between&1&and&40
return&i&%&10&+&1;&&//&result&is&now&uniformly&random&between&1&and&10
这个算法做到了从40个数字均匀映射到1到10,这样说有些抽象,进一步形象的来说明,考虑如下的种子矩阵:
int&seed7[7][7]&=&{
&&&&{1&,&2&,&3&,&4&,&5&,&6&,&7},
&&&&{8&,&9&,&10,&1&,&2&,&3&,&4},
&&&&{5&,&6&,&7&,&8&,&9&,&10,&1},
&&&&{2&,&3&,&4&,&5&,&6&,&7&,&8},
&&&&{9&,&10,&1&,&2&,&3&,&4&,&5},
&&&&{6&,&7&,&8&,&9&,&10,&0&,&0},
&&&&{0&,&0&,&0&,&0&,&0&,&0&,&0}
如果用x=0...6,y=1...7,则变换i=7x+y与矩阵中每个元素位置与(x,y)唯一对应,也就是x选择行,y选择列,如果x和y都是均匀分布,那么这49个位置有相同的被选中的概率=1/49。下面这行代码实现了这个变换:
i&=&7&*&(rand7()&-&1)&+&rand7();其中7*(rand7()-1)相当于选择种子矩阵中的行,第二个rand7相当于选择列,而最后的模10+1运算,就恰好生成了矩阵中每个元素的值,但是(i&40)这个循环条件把最后的9个值变为了0。因此代码1等价于在种子矩阵中做选择。再来看,在这个矩阵中1-10数字一共出现了40次,每个数字出现4次,0出现了9次。我们在这个表里筛选,如果选中了0则重新选一次,如果非0则返回结果,那么1-10恰好可以得到平均机会。(更理论也更准确地说,这是一个条件概率。我们看一下在不选0的前提下选择到1的概率,令B=不选择零,A=选择到1,那么
P(A)=4/49,P(B)=40/49.
因为只要选择到1,B就必然成立,所以P(B|A)=1,令P(A|B)=在不选择零的前提下选择到1的概率,则根据Bayes公式
P(A|B)=P(B|A)*P(A)/P(B)=4/40=1/10. 其他的数字也都可以得出这个结论,因此,在不选择0的前提下,1-10的概率都=1/10。)因此有代码2:
& &&int&result&=&0;
&&&&while&(!result)
&&&&&&&&result&=&seed7[rand7()&-&1][rand()&-&1];&
显然,代码1与代码2是等价的。我个人更喜欢代码2,因为快。天下武功,唯坚不催,唯快不破。
舍去法效率的分析
现在看看rand7被调用的次数——这主要是由舍去率(或者反过来命中率决定的)。这两个代码每生成一个随机数调用rand7的次数不确定,那么平均调用了多少次呢?种子矩阵中选择一次,命中非0的概率有40/49,命中0的概率是9/49,这个过程是一个伯努利实验,进行n次选取平均(期望值)可以选出n*40/49个非0,因此生成100个非0就需要平均调用n*40/49&=100次,也就是n=100*49/40=122.5. 生成一个随机数需要进行两次选取,这意味着平均调用rand7的次数为2*1.225=2.45次。尽管生成一个随机数调用rand7的次数并不确定,但是平均调用不到2.5次,这个效率还是不错的。代码2用7*7的内存替换了代码1的模10运算,牺牲了空间以换来更高的速度。
舍去法还有其他很多种构造方法。网友谈论的比较多的是构造rand2+rand5构造,以及rand2+rand14构造。方法如下:
rand2+rand5: 先构造rand2,然后构造rand5,利用如果rand2==1,则返回1-5,如果rand2==2,则返回rand5+5。
rand2+rand7: 先构造rand2,然后构造rand14,利用如果rand2==1,则返回1-7,如果rand2==2,则返回rand7+7。最后再舍去4个数字,最后得到rand10。
rand2的构造方法,目前我所知道最好的方法是1/7的舍去率:1-7中奇数多一个,舍去一个奇数,再让奇数对应1,偶数对应2,这样就得到了rand2。rand7-&rand5的舍去率是2/7,rand14-&rand10的舍去率是4/14,因此这两种方法的总舍去率都是1/7+2/7=3/7=0.429. 而代码1和代码2做两次rand7运算,每次的舍去率是9/49,因此总舍去率为18/49=0.367,略优于这两种算法。
2. 直接法——利用rand7做计算
由于舍去法每次调用rand7的次数未知,所以希望能够找到一种直接的方法。当然最直接的方法就是用线性同余这样的随机数生成法直接写一个,但是这就用不上rand7了,与题意不符合。有人希望用rand7的各种组合计算来完成,比如(rand7+rand7+rand7+...)%10+1或者(rand7*rand7*rand7*...)%10+1,有些计算确实能够达到很好的均匀度,但却是近似均匀。
从统计学的角度看, 一个rand7就相当于符合均匀分布的随机变量X1,当n个rand7做运算的时候,相当于X1...Xn是符合均匀分布的边缘随机变量,而F(X1, X2,...,Xn)是他们的联合分布,这个分布并非是均匀的,甚至很复杂,如果不用穷举法,几乎没有简便的方法计算每个数字出现的概率。现在要将多随机变量的F(X1,X2,...,Xn)映射到1到10的均匀分布,显然是有一定难度的, 而在本题来说,是不可能的,这是因为:
1) 对rand7的一元运算只能有7种结果,不可能产生10个随机数
2) 现在有二元运算(X)可以是加减乘除或者任何函数任何映射关系,rand7(X)rand7的可能运算方式是7*7种,,n次二元(X)运算后的可能是运算方式是7^(n+1)种,现在要用7^(n+1)种运算过程得到均匀的10种结果,这是不可能的,(因为7^(n+1)不能被10整除),所以只能是近似均匀。
下面来看怎样获得近似的均匀,
提醒我注意到,其中的一个比较好的方法是:
(rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+rand7())%10+1
他获得的均匀度非常好,1出现的最多,5出现的最少,但是概率上仅仅相差0.00002,人类的感觉已经分辨不出来了。但是这个方法需要调用10次rand7,效率上差一些。
有人希望用这样的方法:调用两次rand7从而生成一个7进制的数,然后转换成0-49,刚好是50个数的均匀分布,再取模10。这个方法貌似可行,可是很遗憾的是,这样生成的7进制0-66对应到10进制是0-48,而不是49,少了一个数。
下面这个方法也比较好,(rand7+(rand7+7) +(rand7+14)+...+(rand7+42))%10,这个表达式生成7个随机数,分别均匀分布在1-7,8-14,...7个区间,相加之后再做模10运算,映射到0-9这10个数字。这7^7种运算,统计每个数字可以得到次数,其中5最高,0最低,但是他们几率的差仅为0.00041,人的感觉几乎分辨不出来了。这个方法需要调用7次rand7,效率比上面的代码高一些,因此有:
& &&int&rand10_7plus()&&
&&&&&&&&return&(rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+rand7()+147)%10+1;&&
这种直接方法,无论怎样在理论上都做不到均匀分布,所以,我们要想一些办法来提高。
3. 直接法——利用组合方法进一步提高
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{6, 5, 4, 3, 2, 1, 10, 9, 8, 7 }
用rand7_plus在第一行中选择的时候6的机会最大,1的机会最小,但是在第二行选择的时候1的机会最大,6的机会最小,这两行有一定的互补性,所以如果轮流选择这两行,会得到更均匀的分布,根据上面的计数结果,可以得知,最小几率与最大几率的差仅为万分之一。推广一下,如果在数组
& &&int&seed10[10][10]&=&{&&
&&&&&&&&{1,&&2,&&3,&&4,&&5,&&6,&&7,&&8,&&9,&&10},&&
&&&&&&&&{10,&1,&&2,&&3,&&4,&&5,&&6,&&7,&&8,&&9},&&
&&&&&&&&{9,&&10,&1,&&2,&&3,&&4,&&5,&&6,&&7,&&8&},&&
&&&&&&&&{8,&&9,&&10,&1,&&2,&&3,&&4,&&5,&&6,&&7&},&&
&&&&&&&&{7,&&8,&&9,&&10,&1,&&2,&&3,&&4,&&5,&&6&},&&
&&&&&&&&{6,&&7,&&8,&&9,&&10,&1,&&2,&&3,&&4,&&5&},&&
&&&&&&&&{5,&&6,&&7,&&8,&&9,&&10,&1,&&2,&&3,&&4&},&&
&&&&&&&&{4,&&5,&&6,&&7,&&8,&&9,&&10,&1,&&2,&&3&},&&
&&&&&&&&{3,&&4,&&5,&&6,&&7,&&8,&&9,&&10,&1,&&2&},&&
&&&&&&&&{2,&&3,&&4,&&5,&&6,&&7,&&8,&&9,&&10,&1&},&&
之中,依次在每一行用rand10_7plus选择,由于每个数字出现的几率均等,并且在每行和每列上出现的几率均等,在多次调用之后就可以得到均匀分布。
& & unsigned&int&gi&=&0;&&
&&&&int&rand10_matrix()&&
&&&&&&&&//用rand10_7plus生成一个数,选择列&&
&&&&&&&&int&n&=&rand10_7plus()&-&1;&&
&&&&&&&&//轮流选择seed10的行&&
&&&&&&&&return&seed10[gi++&%&10][n];&&
如果利用模运算的循环性质,就不需要seed10这个矩阵,可以验证下面的代码与rand10_matrix是等效的:
& & unsigned&int&gi&=&0;&&
&&&&int&rand10_mod()&&
&&&&&&&&return&((rand10_7plus()&-&1)&+&gi++)&%&10&+&1;&&
这个算法每次调用7次rand7,做一次模运算,不需要额外的内存以及循环,从统计意义上说,已经是个比较好的伪随机数生成器。
4. 随机数测试
最初我在些这个文章的时候,在测试方面出了问题,所以在这里强调两点:
1). 随机度测试,需要每隔10次调用计数一次,以验证每个数字在各个位置上出现的次数是均等的。
代码要与如下类似:
& &&for&(k&=&0;&k&&&100000;&k++)&{&&
&&&&&&&&n&=&0;&&
&&&&&&&&for&(j&=&0;&j&&&10;&j++)&&
&&&&&&&&&&&&n&=&rand10_7plus10();&&
&&&&&&&&result[n&-&1]++;&&
注意result[n - 1]++是在j=0~10这个循环之外的。
2). 概率计算
在编写代码之前,一定要先证明1-10的均匀分布。例如前面10个rand连加的算法,在人的感觉之中已经分辨不出来概率的差别了,因此需要仔细统计一下10个数字,写一个简单的10层循环计数就可以了。很多朋友忽视了这点,并且,我们上面在第2小节证明了这是不可能做到均匀的。如果想不清楚或者很难证明你的方法,于是这个最简单的代码就非常有用:
& &&for&(i1&=&1;&i1&&=&7;&i1++)&&
&&&&for&(i2&=&1;&i2&&=&7;&i2++)&&
&&&&for&(i10&=&1;&i10&&=&7;&i10++)&&
&&&&&&&&result[(i1&+&i2&+&&+&i10)&%&10]++; &
5. 直接法——分布变换与连续随机变量的分布——更实际的应用
除了这道题的一些技巧,题目本身在实战中没有任何应用,比较实际的问题是,假设一个班的学生成绩符合正态分布,如何模拟生成考试成绩。
我们先看如果rand7是1-7的连续均匀分布,如何获得1-10的均匀分布。答案很简单,从几何的角度上看,我们可以把[a,b]线段上的点按照一对一映射到另一个线段[c,d]上去,只需要做一个线性变换y=(x-a)/(b-a)*(d-c)+c. 那么,若x=rand()~U(a,b),则y=~U(c,d),也就是如果rand()是a到b上的均匀分布,则y=(d-c)(x-a)/(b-a)+c是c到d上的均匀分布。对于本例rand10=(rand()-1)/6*9+1. 下面是证明,更一般的情况同理可证:
另外有一个重要的定理来表明变换之后的分布。这可以处理如Y=X^2, Y=e^X等多种变换。定理如下:
这个定理还可以更强一些,f(x)是分段还是也可以,甚至只是一个覆盖(包括)就可以了。从符合一种分布的随机数生成另外一种分布的随机数是统计模拟的课题,其中有非常有趣的变换方法,例如,如果X是(0,1)上的均匀分布,则Y=-a*log(X)是指数分布。
现在来回答如何按照正态分布模拟生成一个班的学生成绩。这个方法被称为Box-Muller算法,如果U1和U2服从 (0,1)区间的均匀分布,做变换R=sqrt(-2*logU1), alpha=2*pi*U2,则X=Rcos(alpha)和Y=Rsin(alpha)是一对独立的 标准正态分布n(0,1)。证明从略。按照这个方法,C语言的rand(),可以模拟生成近似的(0,1)均匀分布,只要rand()/MAX_RAND就可以了,做Box-Muller变换到n(0,1),就可以做出符合学生成绩分布了,概率统计课的基础内容就有。
6. 其他方法
舍去法也是非常重要的一类随机,用来生成各种分布的随机数,另外的方法:比如Metropolis算法,比较著名的还有Markov Chain Monte Carlo (MCMC)算法,这类方法可以看成是一个黑盒子,要求在算法内部通过几次运算很快收敛到一种概率分布,然后返回一个随机数。
7. 参考文献
[1] Casella & Berger
[2] Seminumerical Algorithms, Random Numbers.
2011年10月
2526272829301234567810121314151617181920212223242526272829303112345
阅读排行榜
评论排行榜C++随机数的用法
我的图书馆
C++随机数的用法
randomize():它的功能是初始化随机数发生器。在c++ builder中函数声明如下:extern PACKAGE void __fastcall Randomize(void)其英文描述如下:Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.可以看出,randomize()函数是用系统的时间作为随机数种子,初始化随机数发生器的。&srand():它的功能也是初始化随机数发生器。在c++ builder中函数声明如下:void srand(unsigned seed)其英文描述:Initializes random number generator.The random number generator is reinitialized by calling srand with an argument value of 1. It can be set to a new starting point by calling srand with a given seed number.可以看出:srand()是通过参数seed来指定随机数种子的。&指定了随机数种子,我们就可以调用函数 rand()和 random()来产生随机数了。调用它可以返回一个随机数。rand()函数其定义如下int rand():调用它将返回一个0--32767之间的一个int 型数值。&random()函数其定义如下:int random(int num):调用它可以返回一个 0---(num-1)之间的一个int 型数值。&若想返回一个从[a,b)之间的数,可以通过一个通用的公式:(rand()%(b-a))+a& 返回的数值包含a,包含b。若 a=0,就可以返回一个 0--b之间的数值。&在实际的应用中,要注意的是:若初始化随机数种子一样,则它产生的随机数是一样的。反之,若每次想产生不同的随机数,则必须使每次的随机数种子不一样才行。学过别的高级语言的都知道,产生随机数用的都是类似于random这样的字符,c++也不例外,在C++中使用的是rand()函数,但是不同的是,如果在C++中只使用了例如 "i=rand();"这样,使用程序会发现每次得到的随机数都是一样的,据了解在C++中这样做是为了方便调试。如果要每次都长生不同的随机数,我们则需要在C++中加上"srand(time(NULL));"这条语句,他的作用是以时间为种子,产生随机数(我们都知道时间是在不断变化的,但两次获取随机数要在1秒后,否则数值还是一样),下面看个例子。&&& 该例子是:在1~100内生成一个随机数,并指定一个数,显示出该数在产生多少个数后出现。程序代码如下:#include &iostream&#define fnum 56&&&&&&&&&&&&&& //要找的数为56int main(){& int num=0,j,k=0;& int get_rand();&&& srand(time(0));&& for(j=1;num!=j++,k++)&&&&&&&&&&& {&&&&& num=get_rand();&&& if(num&10)&&&&&&&&&&&&&&&& //右对齐&&&&&&&&& cout&&" "&&num&&"& ";&&&&&&&&&&& else&&&&&&&&& cout&&num&&"& ";&&&&&&&&&&&&&&&&&& if(j==15)&&&&&&&&&&&&&&&& //每行15个数&&&&&&& {&&&&&&&&& putchar('n');&&&&&&&&& j=0;&&&&&&& }&& }&&& cout&&'n'&&"数字"&&fnum&&"已经找到,共生成了"&&k&&"个随机数。"&&return 0;}int get_rand(){&& i=rand()%100+1;&&&&}///////////////////////////////////////&&&&&&&&所谓的“伪随机数”指的并不是假的随机数,这里的“伪”是有规律的意思。其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机 数。计算机生成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律,一部份则不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正点到了事物的特性 —— 规律性;但是每种树的叶子都有近似的形状,这正是事物的共性 —— 规律性。从这个角度讲,我们就可以接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。&&&&&&&&C++中的标准库&cstdlib&(包含在&iostream&中)提供两个帮助生成伪随机数的函数:rand()和srand()。函数一:int rand(void);从srand(seed)中指定seed开始,返回一个范围介于[seed,RAND_MAX(0x7fff))的随机整数函数二:void srand(unsigned seed);参数seed是rand()的随机种子,即用来初始化rand()的起始值。&&&&系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么rand ()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么rand()就会自动调用srand (1),即系统默认将1作为伪随机数的初始值。&&&&由上述可得知,如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的参数seed指定一个变值,这个变值必须在每次 程序运行时都不一样(比如到目前为止流逝的时间);如果我们给seed指定的是一个定值,那么每次程序运行的时候,rand()产生的随机数都会一样,只 不过这个值是[seed,RAND_MAX(0x7fff))范围中的一个随机取得的值。&&&&举几个例子说明一下,假设我们要取得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,虽然值跟程序二不一样,不过每次运行时的结果也都相同。程序四(指定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,... ...每次的运行结果都不一样,因为每次启动程序时的时刻都不同。关于time_t time(0)&&&&time_t 被定义为长整型,它将返回从日零时零分零秒到现在所经历过的时间,单位为秒。比如输出 cout&&time(0) ,将得到值约为,约等于37(年)* 365(天)* 24(小时)* 3600(秒)(月和日不计)。关于ran_num=rand()%6&&&&将rand()的返回值与6求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则很可能会得到一个非常巨大的数值 (RAND_MAX一般为32767)。一个通用的公式是:要想取得[a,b)之间的随机整数,使用(rand()%(b-a))+ a,结果包含 a 而不含 b 。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 随机数代码 的文章

 

随机推荐