一种不等概率随机数产生办法

一种不等概率随机数产生办法

Java实用工具库Java.util中的Random提供了产生各种类型随机的方法,它可以产生int,long,float,double等类型的随机数。例如:

运行结果:

下面来说说等概率随机数产生办法,其实这个很简单,如下函数就已经轻松实现了获得0--max-1之内的等概率随机整数:

在J2ME手机游戏开发中,经常会使用这种方式获得等概率随机整数。

但是有时在游戏编程中,我们可能需要所获取的随机数概率并不相同,比方说从怪物身上掉落的装备的概率往往是级别愈高,掉落的愈低,反正则愈高。好了让我来把问题抽象为如下编程任务:假定需要产生0到n之间(包括0和n)的随机数,并且要求产生0的概率最大,1次之,2又比1次之,以此类推,n的概率最低。问题清楚了,那么就来考虑一下算法问题,为简单起见,我让产生各个数字的概率等差递减,也就是说,各个随机数的概率之比为:n+1:n:n-1:n-2:......1,那么首先要构造一个区间,区间的下限为0,上限为各个比例数字之和,也就是(n+1)+n+(n-1)+......+1。那么,构造这样一个区间有什么用呢?首先把这个大区间划分为n+1个长度不等的区间,每个小区间的跨度和各个数字的产生概率对应,也就是[0,n](跨度为n+1),[n+1,2n](跨度为n),以此类推,因此这些小区间就代表了各个数字产生的概率。最后在大区间中生成一个等概率随机数x,x落在哪个小区间内,那么就产生代表该区间的那个数字。产生等差递减概率的随机数的思路有了,那么下面的代码就不难理解了:

最后给出我写得一个等概率随机数与不等概率随机数测试与验证程序代码:

最后给出该程序某次运行的结果:


by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。 

PPS(Probability Proportional to Size)不等概率抽样是一种抽样方法,其中每个样本的选择概率与该样本的大小成比例。在这里,我们将介绍如何使用应用代码法和Lahiri法两种方法实施PPS不等概率抽样。 应用代码法: 1. 计算总体大小(N)和样本大小(n)。 2. 对每个单位赋予一个编号,从1到N。 3. 按编号顺序排序所有单位。 4. 计算总体大小的比例因子(K):K = N / Σ单位大小。 5. 计算每个单位的选择概率(pi):pi = K * 单位大小。 6. 使用随机数生成器从1到N之间选取n个整数,这些整数对应于样本中的n个单位。 7. 根据这些整数选择样本。 Lahiri法: 1. 计算总体大小(N)和样本大小(n)。 2. 对每个单位赋予一个编号,从1到N。 3. 按编号顺序排序所有单位。 4. 计算总体大小的比例因子(K):K = N / Σ单位大小。 5. 计算每个单位的选择概率(pi):pi = K * 单位大小。 6. 计算一个累积概率列表,其中第i个元素为Σpi(j),其中j ≤ i。 7. 从0到1之间生成n个随机数。 8. 对于每个随机数,使用二分查找在累积概率列表中找到对应的位置,并选择该位置对应的单位。 下面是Python代码示例,用于实现PPS不等概率抽样的应用代码法和Lahiri法两种方法: ```python import random def pps_sampling_application_code(population, n): N = len(population) units = sorted(population, key=lambda x: x["size"]) K = N / sum(unit["size"] for unit in units) probabilities = [unit["size"] * K for unit in units] samples = random.sample(range(N), n) return [units[i] for i in samples] def pps_sampling_lahiri(population, n): N = len(population) units = sorted(population, key=lambda x: x["size"]) K = N / sum(unit["size"] for unit in units) probabilities = [unit["size"] * K for unit in units] cumulative_probabilities = [sum(probabilities[:i+1]) for i in range(N)] samples = [] for i in range(n): r = random.random() left, right = 0, N - 1 while left < right: mid = (left + right) // 2 if cumulative_probabilities[mid] < r: left = mid + 1 else: right = mid samples.append(units[right]) return samples ``` 这两种方法都需要将总体中的每个单位表示为一个带有“size”键的字典。函数pps_sampling_application_code和pps_sampling_lahiri都采用一个population列表和一个n参数,分别表示总体和样本大小。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值