数据结构算法面试题精选及整理-随机数rand7生成rand10函数
来源:互联网 发布:深入浅出mysql百度云 编辑:程序博客网 时间:2024/05/01 06:28
据说来自百度的一个面试题
问题其实很简单:
就是一个函数rand7()可以生成1~7的随机数,现在要求用这个随机数生成器来生成rand10()函数。
条件是:不能用循环或递归
在点击打开链接里面有讨论。这里要感谢一下这个好学的同学。整理了一下,我就不再整理了。
不过这里可以提供我的思路
大致方法如下:
然后再生成[1 ,2 ,3, 4, 5]上的随机函数_rand5()。
然后用_rand2()函数来决定是选择1~5,还是6~10。想必你应该明白了。
/*生成[1, 2, 3, 4, 5]的方法可以按照打表法来进行 1次 1 2 3 4 5 1 2 ; = (rand() + 4) % 5 + 1 2次 3 4 5 1 2 3 4 ; = (rand() + 1) % 5 + 1 3次 5 1 2 3 4 5 1 ; = (rand() + 3) % 5 + 1 4次 2 3 4 5 1 2 3 ; = (rand() + 0) % 5 + 1 5次 4 5 1 2 3 4 5 ; = (rand() + 2) % 5 + 1 以后第6次照第一次来生成 也可以用如下等价代码来生成。 用同样的办法可以生成[1, 2]随机数*/static int _rand5(){static int i = 0;int t = (_rand7() + i) % 5 + 1;i = (i + 1) % 5;return t;}static int _rand2(){static int j = 0;int t = (_rand7() + j) % 2 + 1;j = !j;return t;}
有了上面两个函数,那么生成[1 10]上的随机函数则比较容易:
首先调用_rand2(),看下是否等于1,如果等于1则直接返回1~5否则返回6~10
int _rand10(){int v = _rand2();if (1 == v){return _rand5();}else return 5 + _rand5();}
这里再加上测试代码
int main(void){int rec[11];memset(rec, 0, sizeof(rec));for (int i = 0; i < 10000000; ++i){rec[_rand10()] ++;}for (int i = 1; i < 11; ++i){printf("%.12f\n", (double)(rec[i])/10000000.0);}return 0;}
结果输出:
0.100070700000
0.100000000000
0.100049700000
0.099718400000
0.099943200000
0.100126300000
0.099963900000
0.100145500000
0.099947300000
0.100035000000
完整代码给出如下:
#include<stdio.h> #include<stdlib.h>#include<string.h>static int _rand7(){return rand() % 7 + 1;}/*生成[1, 2, 3, 4, 5]的方法可以按照打表法来进行 1次 1 2 3 4 5 1 2 ; = (rand() + 4) % 5 + 1 2次 3 4 5 1 2 3 4 ; = (rand() + 1) % 5 + 1 3次 5 1 2 3 4 5 1 ; = (rand() + 3) % 5 + 1 4次 2 3 4 5 1 2 3 ; = (rand() + 0) % 5 + 1 5次 4 5 1 2 3 4 5 ; = (rand() + 2) % 5 + 1 以后第6次照第一次来生成 也可以用如下等价代码来生成。 用同样的办法可以生成[1, 2]随机数*/static int _rand5(){static int i = 0;int t = (_rand7() + i) % 5 + 1;i = (i + 1) % 5;return t;}static int _rand2(){static int j = 0;int t = (_rand7() + j) % 2 + 1;j = !j;return t;}int _rand10(){int v = _rand2();if (1 == v){return _rand5();}else return 5 + _rand5();}int main(void){int rec[11];memset(rec, 0, sizeof(rec));for (int i = 0; i < 10000000; ++i){rec[_rand10()] ++;}for (int i = 1; i < 11; ++i){printf("%.12f\n", (double)(rec[i])/10000000.0);}return 0;}
欢迎大家讨论~~
再给两个参考链接
1 点击打开链接
2点击打开链接
- 数据结构算法面试题精选及整理-随机数rand7生成rand10函数
- 【Killua笔试面试题整理】由随机函数rand7构造rand10
- 数据结构算法面试题精选及整理-二叉树
- 【面试题】:利用rand7模拟rand10
- 由rand7生成rand10以及随机数生成方法的讨论
- 由rand7生成rand10以及随机数生成方法的讨论
- 由rand7生成rand10以及随机数生成方法
- 由rand7生成rand10以及随机数生成方法的讨论
- 由rand7生成rand10以及随机数生成方法的讨论
- rand7生成rand10
- 已知随机数函数rand7(),如何构造rand10()函数
- 随机数:关于用Rand7生成Rand10的最准确的算法(MS中的一道题)--仿真证明
- 【每天学点算法题10.16】由rand7()生成rand10()
- 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
- 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
- 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数rand10(),该函数能够生成1-10的随机数。
- 由随机函数rand7构造rand10
- 由随机函数rand7构造rand10
- ==和equals方法的区别是什么?hashCode方法的作用?
- 接口和抽象类相关面试题
- 【转】Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系
- Flash&Flex大全
- android中post和get两种方式发送请求
- 数据结构算法面试题精选及整理-随机数rand7生成rand10函数
- js event.keyCode
- [ASP.net WebForm] GridView的CommandField Button做刪除提示
- 惊喜还是承诺
- 搭建Linux内核代码阅读环境
- 一道使用了翻手算法解答的算法题
- 命名空间-namespace含义
- VC6 下使用 STLPort
- lrzsz工具的安装步骤