加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 随机选择指定概率分布范围内的数字

发布时间:2020-12-15 04:25:07 所属栏目:Java 来源:网络整理
导读:我想从3-10或4-6等范围中选择一个随机数.应该选择数字,使得数字越低,选择的机会就越多.我下面的代码只选择具有相同概率的每个数字. private int bonusPoints;private double randomBonusPoints = Math.Random() * 100;bonusPoints = (int)randomBonusPoints;
我想从3-10或4-6等范围中选择一个随机数.应该选择数字,使得数字越低,选择的机会就越多.我下面的代码只选择具有相同概率的每个数字.

private int bonusPoints;
private double randomBonusPoints = Math.Random() * 100;

bonusPoints = (int)randomBonusPoints;

如何选择P(3,4,5)= 85%,P(6,7,8)= 10%,P(9,10)= 5%等分布?

解决方法

如果您的发行版可能会发生变化,那么您不希望以Kevin的答案方式对您的发行版进行硬编码,您可以使用 NavigableMap方法使用 NavigableMap.这允许您为选择选项指定权重.然后,您可以生成从0到权重总和的随机数.然后根据您的加权分布统计输出.

创建地图后,选择条目的代码非常短:

Random rand = new Random();
...
double rnd = rand.nextDouble() * totalWeight;
int elem = map.ceilingEntry(rnd).getValue();

要创建任意分布,您可以执行以下操作:

int[] options = new int[]{3,5,6,8,9,10};
double[] weights = new double[]{ 0.85/3d,0.85/3d,0.10/3d,0.05/2d,0.05/2d };

NavigableMap<Double,Integer> map = new TreeMap<Double,Integer>();
double totalWeight = 0d;

for (int i = 0; i < weights.length; i++) {
    totalWeight += weights[i];
    map.put(totalWeight,options[i]);
}

测试这10000多个选项给出了以下权重:

03: 28.99% 
04: 28.10% 
05: 28.06% 
06: 3.27% 
07: 3.62% 
08: 3.08% 
09: 2.40% 
10: 2.48%  

测试代码:

//  select from the weighted elements
Random rand = new Random();
HashMap<Integer,Double> freqs = new HashMap<Integer,Double>();
int iterations = 10000;
for(int i = 0; i < iterations; i++) {
    double rnd = rand.nextDouble() * totalWeight;
    int elem = map.ceilingEntry(rnd).getValue();
    freqs.put(elem,(freqs.containsKey(elem) ? freqs.get(elem) : 0) + (1d/iterations));
}
Map<Integer,Double> sortedFreqs = new TreeMap<Integer,Double>(freqs);

for(Map.Entry<Integer,Double> entry : sortedFreqs.entrySet()) {
    System.out.printf("%02d: %.2f%% %n",entry.getKey(),entry.getValue() * 100d);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读