2014阿里校招 -- 随机数生成小结

题目描述:用rand_7实现rand_3,rand_23,rand_49。rand_7随机生成[1,7]的整型数据。

 可以证明通过截短rand_3()可以等概率生成随机数。

int rand_3()
{
	int tmp = 0;
	while(tmp = rand_7())
	{
		if(tmp <= 3)
			return tmp;
	}
}

int rand_49()
{
	return ( 7 * (rand_7() - 1) + rand_7() );
}

int rand_23()
{
	int tmp = 0;
	while ( tmp = 7 * ( rand_7() - 1 ) + rand_7() )
	{
		// if(tmp <= 23)  
		// 使得有更高的概率跳出循环,减少循环次数。选取最接近49的23的倍数。
		if(tmp <= 46)
			return (tmp % 23 + 1);
	}
}

更加一般的结论:
对于a < b,一定可以用rand_b来生成rand_a,rand_a(输出在[1,a]的随机数!!
对于a > b,可以用 b*(rand_b-1)+rand_b来生成,若不够还可以用b^2*(rand_b-1)+rand_b...!!
之后用 int(b^2/a)*a 最接近的整数来增大截短概率,避免无限循环。


 扩展:给你rand_a和rand_b,生成rand_ab(),在[1, a*b]之间的随机数。

int rand_a_b()
{
	// return (b * (rand_a() - 1) + rand_b());
	return (a * (rand_b() - 1) + rand_a());
}


再扩展:给你rand_a_b,可以生成[a,b]之间的随机数,请生成rand_c_d()。

思路:由rand_a_b生成[1,b-a+1],比较 (b-a+1) vs (d-c+1),利用前边的结论一定可以生成[1,d-c+1]之间的随机数,加上c-1即可生成[c,d]之间的随机数。


参考了网上的一些文章,自己写的小结和代码(完全是自己码的)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值