返回[0,n)中的一个随机数

一般返回一个[0,n)的随机数,都会使用rand()%n。rand()函数返回区间为[0,RAND_MAX]中的一个数。RAND_MAX在<cstdlib>中定义的。实际上rand()是一个伪随机函数。并且如果n的值很大,那么RAND_MAX就不会均匀地被n除尽,一些余数出现的概率将会比其他的更大。假定RAND_MAX是32767,且n等于20000。则rand()将会有两个不同的值能令rand()%n等于10000(即10000和30000),但rand()仅有一个值能让rand()%n等于15000(即15000)。所以rand()%20000产生10000的概率是产生15000概率的两倍。
为了避免这些缺陷,我们将使用一种不同的策略。把这些可利用的随机数分成长度精确相等的存储桶。我们能计算一个随机数并返回相应的存储桶的编号。因为存储桶的长度相同,所以某些随机数根本没可能进入到任何的存储桶中。这样的话,我们会反复请求随机数,直到获得一个合适的为止。

代码如下:


// return a random integer in the range `[0,' `n)'
int nrand(int n)
{
	if (n <= 0 || n > RAND_MAX)
		throw domain_error("Argument to nrand is out of range");

	const int bucket_size = RAND_MAX / n;
	int r;

	do r = rand() / bucket_size;
	while (r >= n);

	return r;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值