首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问怎么生成伪随机数

2012-03-20 
请教如何生成伪随机数?已在提问之前查看了csdn上有关随机数的问题了我这个问题有点特殊,自己思考了一下好

请教如何生成伪随机数?
已在提问之前查看了csdn上有关随机数的问题了
我这个问题有点特殊,自己思考了一下好像没有更好的办法

问题表述如下,我有1组数字,例如:0,1,2,...,n
现在要生成一个随机数,属于0~n,但是我希望生成的概率是

P(0)>P(1)>P(2)>...>P(n),请问有没有好的解决方法和思路?
谢谢。



[解决办法]
我们简单起见,让产生各个数字的概率等差递减,也就是说,各个随机数的概率之比为“n+1:n:n-1:……1”。那么,我们首先要构造一个区间,区间的下限为0,上限为各个比率数字之和,也就是(n+1)+n+(n-1)+(n-2)+……+1。那么,构造这样一个区间有什么用呢?我们首先把这个大区间划分为n+1个长度不等的小区间,每个小区间的跨度和各个数字的产生概率对应,也就是[0, n](跨度为n+1),[n+1, 2n](跨度为n),以此类推。因此,这些小区间就代表了各个数字产生的概率。最后在大区间中生成一个等概率随机数x,x落在哪个小区间内,那么就产生该区间代表的那个数字。

当然,这个方法首先要知道P(0) ,P(1) ,P(2) ,... ,P(n)的值。
[解决办法]
1. 找一个[0,1)上均匀分布的随机数,你可以用rand()*1.0/MAX_INT来模拟

2. 对于{0,1,2,...n}假定我们希望他得到的各个数字的概率分别是P(i),那么我们可以构建下面的数组
数组中元素i的个数为P(0)*n*k ,其中k是一个大常量,确保所有元素对应的个数为正整数

例如对于集合{0,1,2},我们期望P(0)=1/2, P(1)=1/5, P(2) = 3/10,则我们构建的数组是
{0,0,0,0,0,1,1,2,2,2}

3. 根据1中得到的随机数在2中得到的数组中随机选择,就是你要的
这是因为随机数是均匀的,因此2中数组中每个元素被选中的机会均等,由于他们的个数正好满足你要求的概率比例关系,因此就实现了目的

热点排行