数据结构算法面试题精选及整理-随机数rand7生成rand10函数
2011-10-09 01:30
627 查看
据说来自百度的一个面试题
问题其实很简单:
就是一个函数rand7()可以生成1~7的随机数,现在要求用这个随机数生成器来生成rand10()函数。
条件是:不能用循环或递归
在点击打开链接里面有讨论。这里要感谢一下这个好学的同学。整理了一下,我就不再整理了。
不过这里可以提供我的思路
大致方法如下:
首先需要生成[1 2]上的随机函数_rand2()。
然后再生成[1 ,2 ,3, 4, 5]上的随机函数_rand5()。
然后用_rand2()函数来决定是选择1~5,还是6~10。想必你应该明白了。
这两个函数都可以通过打表法来生成。
有了上面两个函数,那么生成[1 10]上的随机函数则比较容易:
首先调用_rand2(),看下是否等于1,如果等于1则直接返回1~5
否则返回6~10
这里再加上测试代码
结果输出:
0.100070700000
0.100000000000
0.100049700000
0.099718400000
0.099943200000
0.100126300000
0.099963900000
0.100145500000
0.099947300000
0.100035000000
完整代码给出如下:
欢迎大家讨论~~
再给两个参考链接
1 点击打开链接
2点击打开链接
问题其实很简单:
就是一个函数rand7()可以生成1~7的随机数,现在要求用这个随机数生成器来生成rand10()函数。
条件是:不能用循环或递归
在点击打开链接里面有讨论。这里要感谢一下这个好学的同学。整理了一下,我就不再整理了。
不过这里可以提供我的思路
大致方法如下:
首先需要生成[1 2]上的随机函数_rand2()。
然后再生成[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点击打开链接
相关文章推荐
- [笔面] 数据结构及算法面试题整理
- 各大公司数据结构与算法面试题解答(二)
- 数据结构实验报告-图算法-最小生成树-最短路-拓扑排序-搜索
- 微软的22道数据结构算法面试题(含…
- 数据结构基础算法整理归纳:选择排序(四)
- 《转》微软的22道数据结构算法面试题(含答案)
- 数据结构与算法之带权图的最小生成树
- 数据结构与算法学习笔记03(腾讯面试题)
- 数据结构与算法问题 北大oj 2075(最小生成树)
- 数据结构与算法笔记 lesson 10 栈 二进制转换十进制
- 每日一道算法题:Google面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 算法与数据结构(五) 普利姆与克鲁斯卡尔的最小生成树(Swift版)
- 2017届毕业生安卓面试题-数据结构与算法
- 微软的22道数据结构算法面试题(含答案)
- 数据结构基础算法整理归纳:插入排序(三)
- 数据结构与算法16:最小生成树普利姆prim算法
- 22道数据结构算法面试题
- 微软的22道数据结构算法面试题
- 数据结构与算法整理之排序(一)
- PTA 数据结构与算法题目集(中文)6-10