给一个生成0-a的随机整数的函数,如何生成0-b的随机整数? (a,b都是正整数且之间没有关系)

本文介绍了如何通过已有的生成0-a的随机整数函数,来构造一个生成0-b(b>a)的随机整数函数。主要思路包括:当a>b时,只需在生成的数大于b时重新生成;当a<b时,使用RandomA()*(a+1)+RandomA()+1公式,并确保生成的整数在1-36范围内均匀分布。如果生成的数与b有特定关系,可以避免丢弃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思路:首先对于a和b

1)如果a大于b,那么生成0-b的随机整数的函数只需要加个判断条件,即只要生成0-a的随机整数的函数的随机值大于b,那么我们丢弃它,在重新生成一次。

2)如果a小于b,那么我们就要通过生成0-a的随机整数的函数构造一个生成随机值范围更大的函数。其中一个通式是 RandomA()*(a+1)+RandomA()+1。我们取a = 5来分析一下。

首先 RandomA得到一个集合A={0,1,2,3,4,5},其中每一个的概率都是1/6。RandomA()*(a+1)也得到一个集合B={0,6,12,18,24,30},其中每一个的概率也是1/6。

而RandomA()+1得到的集合A={1,2,3,4,5,6}中每个整数出现的概率也是1/6。显然集合A和B中任何两个元素组合可以与1-36之间的一个整数一一对应,也就是说1-36之间的任何一个数,可以唯一确定A和B中两个元素的一种组合方式。由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/6*1/6=1/36。因此RandomA()*(a+1)+RandomA()+1生成的整数均匀分布在1-36之间,每个数的概率都是1/36。

然后就有返回到1)了,如果RandomA()*(a+1)+RandomA()+1生成的整数大于b,那么丢弃,再重新生成。当然如过RandomA()*(a+1)+RandomA()+1随机生成的整数与b之间存在某种关系,那么就不需要丢弃。例如对RandomA()*(a+1)+RandomA()+1求余刚好与b与之对应。

代码:

int RandomB()
{
	int val;
	if(a > b)
	{
		while(val=RandomA() > b);
		return val;
	}
	else
	{
		while(val=RandomA()*(a+1)+RandomA()+1 > b);
		return val;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值