解决问题方法论之化繁为简 - 一道算法题rand5()到rand7()

前天睡觉前浏览网页,看到下面的面试题:已知rand5()是产生1到5的随机数,怎么根据rand5()产生rand7()的随机数。


坐在电脑前想了一会,没思路,最后睡觉,快睡着的时候,迷迷糊糊地居然能想到解决办法(其实之前几次,算法思路都是这种情况下萌生的,也是服了我自己了)。下面把前后的思路写出来。


1.当时潜意识第一反应便是rand5()*7/5,结果当然是迅速否定了,这变成了不是求随机,而是求平均数。

2.能否用rand5()得出rand2(),然后两个一起做点事情?也否定了,这也是求平均数而已。

3.然后就想着把题目变得简单一点看看怎么做。如果是rand10()到rand5(),这就好办了,直接除以2就可以了。

4.那如果是rand11()到rand5()呢,也很简单,只要rand出来的是10或者以下的,就直接应用rand10到rand5的逻辑,如果是11的话,就再rand11()一次就好了,反复循环。

5.换句话来说,对于任何的randN到randM,只要N>M,都可以这样来解决。

6.所以现在的问题变成怎么让rand5生成一个大于rand7的随机数。

7.很自然地会想到rand25()

8.rand5()*rand5()会得出rand25()吗,显然不能

9.rand5()*5+rand5()呢?貌似有戏!但好像数组索引有点越界还是不够,不要紧,调整一下就可以了。

10.第二天睡醒后,用java写出算法并测试了一下,果然是符合的,问题解决。然后上网搜索一下,大家也是这么解决的。


这条问题本身不重要,重要的是这种思路:复杂的问题可以先尝试化为最简单的问题解决,再逐步把特定条件去掉。


你可能感兴趣的:(算法)