解决问题方法论之化繁为简 - 一道算法题rand5()到rand7()
2015-11-05 22:50
288 查看
前天睡觉前浏览网页,看到下面的面试题:已知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写出算法并测试了一下,果然是符合的,问题解决。然后上网搜索一下,大家也是这么解决的。
这条问题本身不重要,重要的是这种思路:复杂的问题可以先尝试化为最简单的问题解决,再逐步把特定条件去掉。
坐在电脑前想了一会,没思路,最后睡觉,快睡着的时候,迷迷糊糊地居然能想到解决办法(其实之前几次,算法思路都是这种情况下萌生的,也是服了我自己了)。下面把前后的思路写出来。
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写出算法并测试了一下,果然是符合的,问题解决。然后上网搜索一下,大家也是这么解决的。
这条问题本身不重要,重要的是这种思路:复杂的问题可以先尝试化为最简单的问题解决,再逐步把特定条件去掉。
相关文章推荐
- JAVA字符串与字符编码处理的终极解决
- Quartz.net开源作业调度
- 冒泡推导
- Ubuntu12.04 进不了图形界面 checking battery state virtualbox
- yycg之药品目录导出(二)+系统参数配置
- 惠普培训随笔
- 烂泥:haproxy学习之https配置
- opencv3 绘制一维直方图-灰度直方图的绘制
- java配置环境变量
- Understanding JVM Internals
- CNN反向求导推导
- java测试中单元测试中Junit、mock和代码覆盖率
- 有时候就是看不进论文-jQuery动画特效篇&MySQL
- Spring的特点
- Android5.0 SharedElement的使用
- C++、C#、java算法学习日记07----堆排序(HeapSort)
- opencv3 绘制二维直方图-H-S直方图
- C#构造函数调用其他构造函数
- nodejs相关--hexo搭建github博客
- 挨踢人的脚步(2015.11.05)