一些常见的概率生成器的题目
来源:互联网 发布:靓邦素化妆品淘宝 编辑:程序博客网 时间:2024/05/28 11:48
已知一随机发生器,产生0 的概率是p,产生1 的概率是1-p,现在要你构造一个发生器,使得它构造0 和1 的概率均为1/2;构造一个发生器,使得它构造1、2、3 的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n 的概率均为1/n,要求复杂度最低。
Run rand() twice, we got 00, 01, 10 or 11. If it’s 00 or 11, discard it, else output 0 for 01, 1 for 10.
Similarly, assume C(M, 2) >= n and C(M-1, 2) < n. Do M rand()’s and get a binary string of M length. Assign 1100...0 to 1, 1010...0 to 2, ...
From: http://blog.163.com/kevinlee_2010/blog/static/16982082020120792429856/
百度的一个面试题目:
.已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,
使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;…,
构造一个发生器,使得它构造1、2、3、…n的概率均为1/n,要求复杂度最低。
初看确实有点头晕,也没什么思路。但是仔细想想为什么生成0和1的概率均为1/2,我们可以看成是生成0和1的概率是均等的。这样想之后,似乎就没那么不好理解了。
原始的随机数生成器,生成0 的概率为p,生成1的概率为1-p,那么怎么构造才能使得生成0和1的概率相等呢。或者说有两个独立的事件的概率是相等呢?
这样来做一下,让该随机数生成器生成两个数,那么序列是00,01,10,11概率分别为 p*p,p(1-p),(1-p)p,(1-p)*(1-p)
很明显,这四种情况中存在两个独立的事件概率是相等。也就是01和10,那么我把01看成是0,10看成是1,那么他们输出的概率均为p(1-p),其他的情况舍弃。这样就得到了0和1均等生成的随机器了。
思维在扩展一下,生成1,2,…n的概率分别是1/n,也就是均等的。那么我们可以想怎么生成一个序列,里面有n个独立时间,概率是相等。而且我们能够猜测到这些概率的形式为 p^x*(1-p)^y,如果要相等,那么x必须等于y.这样就说明了序列中0和1的个数是相等的。而且这样的情况必须有多与n个才行。
数学表示就是 C(2x,x) >=n ,我们只需要知道x就能够知道序列要多长了。而且中间必定有超过n个概率为{p(1-p)}^x不相等序列。
问题就可以解决了。
其实卡我的问题是,丢掉那些多余的,只要n个等概率的序列,是否真的是等概率的(最终输出)。
腾讯面试题:
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
利用的方法和上个问题类似,如何能够得到一个等概率的独立事件。这个问题和上个问题不同的是,这里产生的序列,要变成和的形式或者其他的形式,那么概率就会发生变化了。
如果能够得到一组等概率的数,不管是什么数,只要等概率而且个数大于10,那么问题就可以解决了。
发现(rand7()-1)*7+rand7(),可以等概率的生成1到49。
呵呵,这不就得了,只要把11-49砍掉就可以了。不过这样的效率比较低。可以砍掉41-49,然后在把1-40映射到1-10,那么问题也就解决了。
腾讯面试题:
等概率采样数据流中的数字。
比如从数据流中等概率的采样k个数字。
怎么做呢?先拿到最开始的k个数字,然后以后的每个数字等概率的和这k个数字交换。那么就可以达到每个数字被抽取的概率是等概率的。
怎么证明呢?
采用归纳方法,假设前n个数字等概率的采样k个数字,那么每个数字被采样的概率为k/n,现在新来一个数字,变成了n+1个数字,那么每个数字被采样的概率变位k/(n+1),我们要证明这个
这个问题在计算机程序设计艺术书中提到,叫Reservoir Sampling(蓄水池采样),属于随机算法的一种。
现在假定存在了n个数字,来了第n+1个数字,那么第n+1个数字被选择的概率是k/n+1,那么我们推算其他的数字被选择的概率也是k/n+1
P(其余数字) = p(其余数字|第n+1个选择)*p(第n+1个选择) + p(其余数字|第n+1个不选择)*p(第n+1个不选择)
= k/n*(1-1/k)*k/(n+1) + k/n*(n+1-k)/(n+1)
= k*(k-1) / (n *(n+1) ) + k*(n+1-k) / (n*(n+1))
= k*n/(n *(n+1))
= k/(n+1)
得证。其余数字被选择的概率依然也是 k/(n+1)
- 一些常见的概率生成器的题目
- 一些常见的概率生成器的题目
- 一些常见的概率生成器的题目
- 常见的概率生成器的题目
- 常见的一些题目
- 单链表的一些常见题目
- 概率相关的题目
- 关于概率的题目
- 与概率相关的题目
- 百度的一道概率题目
- 常见的概率相关面
- 常见的概率分布模型
- 常见离散的概率分布
- 常见的连续概率分布
- 一些简单但是常见的算法题目(笔记类)
- 二叉树的一些笔试面试常见题目
- web2.0的一些生成器
- java的常见题目
- EL表达式
- Something About HTML5
- MFC/C++/C中字符类型CString, int, string, char*之间的转换
- 基础例子
- VC6 关键字 friend 问题
- 一些常见的概率生成器的题目
- tftp服务器的配置及调试
- 心得7--EL表达式-11大隐式对象
- 使用Android Lint Checks使你的android应用更健壮
- 美国培育成功奇特水蛇 鼻子上长触角
- poj 2481 Cows(树状数组 | 线段树)
- 舌尖上的职场(一)你最近还好吗?
- CentOS使用iso镜像文件配置本地yum源
- 国网数据函数1