数据生成器

有时我们要验证自己的程序是否正确,需要大量的测试数据,通过生成一些伪随机数来实现这个功能。
[注意]
(1) rand函数的头文件stdlib.h 。rand()生成一个闭区间[0,RAND_MAX] 的均匀随机整数(均匀的含义是:该区间内每个整数被产生的概率相同),其中RAND_MAX至少为32767 (2^15-1,在VS2008中等于此值,#define RAND_MAX 0x7fff),在不同环境下的值可能不同

(2) 严格地说,这里的随机数是“伪随机数”,因为它也是由数学公式计算出来的,不过在算法领域,多数情况下可以把它当作真正地随机数。

(3) 很多人喜欢使用rand()%n产生区间[0,n)内的一个随机整数 。姑且不论这样产生的整数是否仍然均匀分布,当n大于RAND_MAX时,此法并不能得到期望的结果 。如果当n>>RAND_MAX时,要想得到[0,n)内的一个随机整数,可以使用一种“放大”的方法 :先用rand()/RAND_MAX得到[0,1]之间的随机实数,然后再扩大n-1倍之后四舍五入,再加1就可得到[1,n]之间的均匀整数。这样做在n很大时“精度”不好,因为,好比把小图放大后会看到“锯齿”,但当n不是很大的时候,这样做已经可以满足要求了。(如果坚持需要更高的精度,可以采取多次随机的方法

(4) 程序最开始执行了一次srand(time(NULL)) ,其中srand函数用来初始化“随机数种子” 。简单地说,种子是伪随机数计算的依据。种子相同,计算出来的“随机数”序列总是相同的如果不调用srand而直接使用rand(),相当于调用过一次srand(1) ,因此程序每次执行时,将得到同一套随机数。注意,不要在同一个程序每次生成随机数之前都重新调用一次srand,请只在程序开头调用一次srand,而不要在同一个程序中多次调用 。如果需要程序每次执行时使用一个不同的种子,可以用time.h 中的time(NULL) 为参数调用srand,并且只在程序执行的开头调用一次srand。

(5) time函数返回的是自1970年1月1日0点以来经过的“秒数” ,因此每秒才变化一次 。注意,如果你的程序是由操作系统自动批量执行的,可能因为每次运行时间过短,导致在相邻若干次执行时time的返回值全部相同。一个解决办法是,在测试程序的主函数中设置一个循环,做足够多次测试后再退出。

[1] 当n>>RAND_MAX 时,下面的方法将无法得到 我们想要的数据。

[2] 使用”放大法“ 解决[1]中的问题。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值