由随机数rand5实现随机数rand7
程序员文章站
2022-04-28 19:31:45
rand5表示生成随机数1,2,3,4,5 rand7表示生成随机数1,2,3,4,5,6,7 要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5 rand7生成rand5很简单,把6和7排除掉就是rand5了,也就是当随机到大于5的时候,就再随机一次,直到小于 ......
rand5表示生成随机数1,2,3,4,5
rand7表示生成随机数1,2,3,4,5,6,7
要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5
rand7生成rand5很简单,把6和7排除掉就是rand5了,也就是当随机到大于5的时候,就再随机一次,直到小于等于5
代码写起来很容易
public static int rand5(){ random ra =new random(); int result = ra.nextint(7)+1; while (result > 5){ result = ra.nextint(7)+1; } return result; }
这时我们可以用同样的思路,先利用rand5把范围放大,然后再排除掉超出的范围
这里我们用这样的一个公式:newrand = n * (randn – 1) + randn
,这个公式可以保证新的随机数中每个的概率是相同的(可以自己试试其他构造方式,你会发现有的结果中每个数的概率是不同的)
比如rand5,newrand = 5×(rand5-1)+ rand5,那么newrand的范围就是1-25
如果你扩大了一次范围之后还是比目标范围小,那么就再将newrand扩大一下newrand2 = n * (newrand – 1) + randn
这时rand5以及扩大到rand25了,接下来把范围缩小,如果直接排除的话,要除去8-25,这个范围太大了
所以我们找到比25小的最近的7的倍数21
我们把随机数缩小的1-21后,再除以7取余数+1,这样得到的结果就是1-7了
public static int rand7(){ int result = 25; while (result > 21){ result = 5*(rand5()-1)+rand5(); } return result%7+1; }
上一篇: IL指令列表
下一篇: 牛奶和板栗能一起吃吗,其实是不可以的