如何构造另一个随机生成函数?

昨天下午面搜狐的时候被问到了构造随机数生成函数的问题,事后觉得有必要归纳一下相关题型。

1.已知随机数生成函数randA能等概率生成0~n的整数,设计一个等概率生成0~m的randB

算法:
若n大于m,则直接利用randA随机产生的数作为randB,如果randA产生的数大于m则丢弃这个数,重新产生,直至成功。若n远大于m,则只需构造最大值为m*(n/m)的随机函数randC,然后丢弃randA产生的数大于m*(n/m)的那部分即可得到randC。而randB=randC/(n/m)。执行k次仍然没能产生m以内的随机数的概率为((n-m*(n/m))/n)^k。
若n小于m,则利用n进制思路,实现一个随机生成函数randC=randA+randA*(n+1)+randA*(n+1)^2+..etc(一直这样构造,直到使得randC的最大值和randB或randB的倍数接近),randC生成各个数都是等概率的。此时randC>=randB*x (x是任意的倍数),然后丢弃大于的部分即可。若存在a使得((n+1)^a-1)/m可以整除,则存在无需丢弃的可能,否则不可能。

2.给定一个能以60%、40%概率生成0、1的随机函数randA,设计能各以50%概率生成0和1的随机函数

算法:
调用两次randA,有(0,0)、(0,1)…等总共四种情况,其中(0,1),和(1,0)发生的概率相

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值