【数据结构与算法】rand7 生成rand10

rand7:随机生成1-7的数字。那么如何有rand7构建rand10?

大致思路有两种:

1 舍弃法

大多数都是这么叫的。意思是如果有了大的生成小的,可以直接把多与的舍弃掉重新rand。举个例子,如果有了rand10,如何得到rand7?n=rand10,如果n>7,重新rand10,直到n<=7为止。

该方法的思路:

n=(rand7 - 1) * 7 + rand7,如果n大于40,就重试,直到小于等于40

r=n%10 +1

原理:

(rand7 - 1) * 7 + rand7这个式子可以均匀产生1-49。ran7 - 1生成0-6,(rand7 - 1) * 7生成0,7,14,,,42,再加上rand7,范围是1-49。可以用简单的做差的方式验证,对于1-49中任何的数,都不会有两种生成方式。所以,前一个rand7和后一个rand7没有关系,1-49的数是等概率的。进而1-40的数也是等概率的。

如果是randm到randn呢?

如果m>=n,直接舍弃法;

如果m<n,(randm - 1) * m + randm只能最大到m*m,如果m*m<n,可能需要做好几次直到覆盖到n。

 

2 特殊方法

用1-5中每一个数字代表1-10中的两个数字,在用6-7决定是两个中的哪一个。

 

3 组合法

使用一个计数器n,初始值为0。代表次数。

第0次从1,2,3,4,5,6,7中随机取一个;

第1次从2,3,4,5,6,7,8中随机取一个;

第2次从3,4,5,6,7,8,9中随机取一个;

。。。

第10次从10,1,2,3,4,5,6中随机取一个;

后面再按照这个循环来。

这样每一次虽然不是均匀的,但是随着次数的增多,整体来说是均匀的。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值