【算法】等概率问题汇总

来源:互联网 发布:oracle数据库安全管理 编辑:程序博客网 时间:2024/05/16 10:04

【题目一】已知随机函数rand(),以p的概率产生0,以1-p的概率产生1,现在要求设计一个新的随机函数newRand(), 使其以1/n的等概率产生1~n之间的任意一个数。

思路:可以通过已知随机函数rand()产生等概率产生0和1的新随机函数Rand(),然后调用k(k为整数n的二进制表示的位数)次Rand()函数,得到一个长度为k的0和1序列,以此序列所形成的整数即为1--n之间的数字。注意:从产生序列得到的整数有可能大于n,如果大于n的话,则重新产生直至得到的整数不大于n。

【题目二】给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7的整数。

思路:利用5*(rand5()-1)等概率生成0、5、10、15、20五个数字,再由5*(rand5()-1)+rand5()函数等概率生成1-25之间的数字,然后将1~25的数字对3取膜,将其中的1-21映射成1-7,丢弃22-25。

扩展:给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数。(需要考虑m和n的大小关系,代码如下)

int random(int m , int n){int k = rand();int max = n-1;while(k < m){k = k*n + rand();max = max*n + n-1;}return k/(max/n);}

【题目三】已知rand()等概率随即产生0~n-1之间的数,如何产生如下概率的数,0出现1次,1出现2次,...,n-1出现n次

思路:代码如下

int random(int size){while(true){int m = rand(size);int n = rand(size);if(m + n < size)return m+n;}}

题目四:

思路:

0 0
原创粉丝点击