利用rand5来实现rand7(Java)
这是一道很有趣的笔试题,考察随机和概率。这里整理一下。
考试题目
已知rand5能等概率产生1, 2, 3, 4, 5, 现要用rand5来实现rand7。(rand7的意思是要等概率产生1, 2, 3, 4, 5, 6, 7)。
我的解决
这个涉及概率和随机,应当用数学的方式去解决,而不是凑结果。
Java的API库实现的Math.random是等概率的,可以用它来实现rand5()。
rand5()产生从1-5的等概随机数,然后可以用rand5来实现rand7。
rand5()可以实现1-5,那么rand5()-1可以实现等概产生0-4。
如果将上者的结果再线性扩大5被,那么就可以等概产生0,5,10,15,20。
这样再将原来的rand5插入其中,就可以等概的产生0到24。
方程可以概括为:
1 | (rand5() - 1) * 5 + (rand5() - 1) |
以上的过程其实就是将一个随机数经过加上常数和扩大的过程,整个过程是线性的。
接着有了0-24后,需要得到0-6,则需要先裁剪0-24,使之满足7的倍数,即裁剪为0-20这21个数。
最后就可以根据和7取模得到等概的0-6。进而可以得到1-7。
1 | package com.chain.javase.test.day11; |
思考一下,如果是已知rand7,要求实现rand5呢?
道理其实是一样的。
1 | 7 * (rand7() - 1) + (rand7() - 1) |
可以等概生成0-48,共49个数。
45是5的倍数,所以循环中剔除46,47,48,49。
然后使用
1 | t % 5 + 1 |
可以得到结果。
测试结果
先测试rand5():
1 | 200010915 |
再测试rand7():
1 | 142861771 |
可以看到rand5是等概的结果,rand7也是等概的结果。