插空+筛选的原理


// 1: 给定了random5()产生1~5这5个整数的等概率事件

现在要生成random7()

int random5()

{

int x = rand();

if(x > 32000) return random5();

return x%5+1;

}

// (random5()-1)*5 产生均匀0,5,10,15,20, 所以(random5()-1)*5+random()-1 会产生0-24间均匀随机数

// 更通俗一般的如果randomM()产生0~M-1之间的随机数,那么插空一次randomM()*M+randomM()产生0~M^2-1之间的随机数,,  

// 目的要生成N内的随机数,此时如果插空后的最大数仍然小于N,则继续插空,第二次插空产生0~M^3-1之间的随机数

int random7()

{

int x = 5*(random5()-1)+random5()-1;

if(x > 20) return random7();  

//晒选的过程return x%7+1;

}

// 2: 给定了random5()产生1~5这5个整数的等概率事件 现在要生成random40()

int random24()

{  

// 会产生0~24之间的随机数return 5*(random5()-1)+random5()-1;

}

int random40()

{

int x = random24()*5 + random5()-1;  

//会产生0~124之间的随机数if(x>=120) return random40();return x%40+1;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值