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中随机取一个;
后面再按照这个循环来。
这样每一次虽然不是均匀的,但是随着次数的增多,整体来说是均匀的。