当前位置: 首页 > 知识库问答 >
问题:

基于百分比选择值

洪景铄
2023-03-14

我需要根据该值被选择的百分比概率选择一个值。例如:

  • 时间增量值a的10%
  • 时间增量值b的20%
  • 时间增量值c的30%
  • 时间增量值d的40%

百分比加起来总是正好100%

我遇到过几种像这样的解决方案,但我确定它们不可能是正确的。以下是使用上述解决方案构建的示例程序:

import java.util.Random;

public class Main {

    private static Random r = new Random();

    public static void main(String[] args) {
        final int iterations = 1000000;
        System.out.println("Testing percentage based random, " + iterations + " iterations");
        int onePercent = 0;
        int sixPercent = 0;
        int sevenPercent = 0;
        int thirtySixPercent = 0;
        int fiftyPercent = 0;
        // Those values add up to 100% overall
        for (int i = 0; i < iterations; i++) {
            int random = r.nextInt(100);
            if (random < 1) {
                onePercent++;
                continue;
            }
            if (random < 6) {
                sixPercent++;
                continue;
            }
            if (random < 7) {
                sevenPercent++;
                continue;
            }
            if (random < 36) {
                thirtySixPercent++;
                continue;
            }
            if (random < 50) {
                fiftyPercent++;
                continue;
            }
            // That can't be right because if random > 50 then nothing at all happens
        }
        System.out.println("One percent happened about " + (onePercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Six percent happened about " + (sixPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Seven percent happened about " + (sevenPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Thirty six percent happened about " + (thirtySixPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Fifty percent happened about " + (fiftyPercent / Float.valueOf(iterations)) * 100 + "% of the time");
    }
}

输出:

Testing percentage based random, 1000000 iterations
One percent happened about 0.99649996% of the time
Six percent happened about 4.9925% of the time
Seven percent happened about 1.0029999% of the time
Thirty six percent happened about 29.001299% of the time
Fifty percent happened about 14.0191% of the time

预期输出:

Testing percentage based random, 1000000 iterations
One percent happened about 0.99649996% of the time
Six percent happened about 6.9925% of the time
Seven percent happened about 7.0029999% of the time
Thirty six percent happened about 36.001299% of the time
Fifty percent happened about 50.0191% of the time

我相信我需要使用某种算法将百分比转换为从0到99的刻度,以便随机数生成器可以准确地选择一个值。不过,我想不出如何做到这一点。

共有2个答案

令狐良骏
2023-03-14

找到了答案。您需要跟踪到目前为止测试的百分比,并将其添加到当前测试中。

import java.util.Random;

public class Main {

    private static Random r = new Random();

    public static void main(String[] args) {
        final int iterations = 1000000;
        System.out.println("Testing percentage based random, " + iterations + " iterations");
        int onePercent = 0;
        int sixPercent = 0;
        int sevenPercent = 0;
        int thirtySixPercent = 0;
        int fiftyPercent = 0;
        // Those values add up to 100% overall
        for (int i = 0; i < iterations; i++) {
            int random = r.nextInt(100);
            int totalPercent = 0;
            if (random < totalPercent + 1) {
                onePercent++;
                continue;
            }
            totalPercent += 1;
            if (random < totalPercent + 6) {
                sixPercent++;
                continue;
            }
            totalPercent += 6;
            if (random < totalPercent + 7) {
                sevenPercent++;
                continue;
            }
            totalPercent += 7;
            if (random < totalPercent + 36) {
                thirtySixPercent++;
                continue;
            }
            totalPercent += 36;
            if (random < totalPercent + 50) {
                fiftyPercent++;
                continue;
            }
            totalPercent += 50;
            // That can't be right because if random > 50 then nothing at all happens
        }
        System.out.println("One percent happened about " + (onePercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Six percent happened about " + (sixPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Seven percent happened about " + (sevenPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Thirty six percent happened about " + (thirtySixPercent / Float.valueOf(iterations)) * 100 + "% of the time");
        System.out.println("Fifty percent happened about " + (fiftyPercent / Float.valueOf(iterations)) * 100 + "% of the time");
    }
}
芮朗
2023-03-14

您的结果是正确的:

百分之五十发生在百分之十四点零一百九十一的时间里

50 - 36 = 14

36%的时间发生在29.001299%左右

36 - 7 = 29

7%的时间发生在1.002999%左右

7-6=1

....

如果要汇总,请删除所有“continue”语句。

 类似资料:
  • 我希望使用本文提供的答案从列表中随机选择独特的项目。 按照所描述的方法,在我的循环的每次迭代中,我都会生成一个概率值,它是当前项目从列表中被选中的概率百分比。 我需要知道的是,我如何使用这个百分比值来选择项目(或不选择)。 这是我拥有的代码,是

  • 我有以下代码片段: 我的问题是,它真的计算出25%的概率在这里获胜吗?球员在这里获胜的几率真的是25%吗? 编辑: 我刚刚写了这个: 它非常不准确。它从大约0.15到0.3。 但是当我做更多的检查时(从(i 这是为什么?为什么100张支票不够精确?

  • 问题内容: 我想使用第二列(art_count)仅显示那些包含总art_count的X%的行。 我的资料: 到目前为止我的查询: 使用SUM进行了尝试,但未成功。 问题答案: 您需要为插入一个值

  • 问题内容: 我有一个带有PHP脚本的站点,此脚本在返回由JavaScript文件访问的数据的内部有一个SQL查询。该数据是一个庞大的航班数据列表,我需要能够在指定的任何给定日期中随机选择(比如说)全部航班的40%。为了论证,让我们这样说: 我知道要获得随机使用的行数,理想情况下我想说,但这行不通。 编辑: 问题答案: 您可以记录所有内容,然后按以下方式计算所需的内容:

  • 关于这些例子,你知道我如何实现概率吗。 应该在属性中循环 在顶部、右侧、底部和左侧循环以检索其成功率值 随机检索一个方向,根据它的成功率(也就是它的概率)与所有东西进行比较。概率越高的人被呼叫的几率越高 程序在setInterval内,每次interval循环时,都会打印值。我尝试了很多不同的方法,但我想不出来。 更新对于我目前遇到的实际问题。 您可以忽略“未找到”。它只是一个随机字符串。数字根据

  • 问题内容: 我有一张与客户,用户和收入类似的表格(实际上成千上万条记录): 我想做的是只回报支出最高的客户,这些客户占用户总收入的80%。 要手动执行此操作,我将按詹姆斯的客户的收入对其进行排序,计算出总计的百分比和运行的总计百分比,然后仅返回记录,直到运行的总计达到80%: 我已经尝试过使用CTE,但到目前为止还是空白。有没有办法通过单个查询而不是在Excel工作表中手动执行此操作? 问题答案: