给定1-N1的随机数,产生1-N2的随机数(典型:给定产生1-5的随机数,求1-7的随机数函数)

目录

1、问题定义

2、分下列两种情况进行讨论

情况一:若N1 >= N2时

情况二:若N1 < N2时

3、典型例题:给定产生1-5的随机数,求1-7的随机数函数


1、问题定义

已知有一个函数能够产生1-N1之间的的随机数(等概率),通过此函数将其改造成产生1-N2之间的随机数(等概率)。设randN1()为产生1-N1之间的随机数的函数,需要将其改造成randN2()。

2、分下列两种情况进行讨论

情况一:若N1 >= N2时

我们可以用一个例子来讨论这个问题,如给定的函数产生1-50之间的随机数,要将其改成生成1-15之间的随机数。则可以这样考虑,若要将1-50之间的数变为1-15之间的数只需要对15取余运算即可,但是50并不是15的整数倍数,因此无法保证等概率。我想你已经想到了解决办法,即取1-50之间15的最大整数倍数进行取余运算(即45),而大于45的数则舍弃并重新运算。

randN2(){
    if(randN1() > 45) return randN2();
    else return randN1() % 15 + 1;
}

情况二:若N1 < N2时

此时产生的随机数范围比要改造生成的随机数范围小,那么可以先对其进行范围扩大改造,具体方法如下:

1)构造式子(randN1() - 1 ) * N1,那么其变为生成0,N1,2N1,......,(N1-1)N1之间的数

2)再通过第一步的式子构造(randN1() - 1) * N1 + randN1(),那么会生成1 - N1^2之间的数

3)若N1^2 >= N2则可以参照情况一进行计算,否则返回步骤1)继续扩大构造成1 - (N1^2)^2之间的数,直至满足情况一

3、典型例题:给定产生1-5的随机数,求1-7的随机数函数

// 随机生成等概率1-5的函数实现
int random5() {
    int x = rand();   //调用随机函数
    if (x > 32000) return random5();
    return x % 5 + 1;  //1-5
}
// 由random5()构造 random7()
int random7() {
    int x = 5 * (random5() - 1) + random5();
    if (x > 21) return random7();  // 筛选的过程  
    return x % 7 + 1;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值