需要帮助提出一种算法,根据计数和百分比在Java中生成随机布尔值

时间:2018-05-24 15:28:10

标签: java algorithm random

我不确定我是否正确地命名了这篇文章。如果我没有,请告诉我,我将编辑标题。

我要做的是模拟电池充电的“真实世界”情况:

 1st charge == 100% chance of an error (a.k.a., boolean false)
 2nd charge == 90% chance of an error
 3rd charge == 80% chance of an error
 4th charge == 70% chance of an error
 5th charge == 60% chance of an error
 6th charge == 50% chance of an error
 7th charge == 40% chance of an error
 8th charge == 30% chance of an error
 9th charge == 20% chance of an error
10th charge == 10% chance of an error

所以,我需要的是根据这些百分比生成真或假的算法,但我不知道该怎么做。我知道有RandomThreadLocalRandom但是无法为nextBoolean()输入任何边界或值。我想我可以这样做:

switch(charge){
    case 1:
        if(ThreadLocalRandom.nextInt(10,10) > 10) return ThreadLocalRandom.nextBoolean();
        break;
    case 2:
        if(ThreadLocalRandom.nextInt(9,10) > 9) return ThreadLocalRandom.nextBoolean();
        break;
    case 3:
        if(ThreadLocalRandom.nextInt(8,10) > 8) return ThreadLocalRandom.nextBoolean();
        break;
    case 4:
        if(ThreadLocalRandom.nextInt(7,10) > 7) return ThreadLocalRandom.nextBoolean();
        break;
    case 5:
        if(ThreadLocalRandom.nextInt(6,10) > 6) return ThreadLocalRandom.nextBoolean();
        break;
    case 6:
        if(ThreadLocalRandom.nextInt(5,10) > 5) return ThreadLocalRandom.nextBoolean();
        break;
    case 7:
        if(ThreadLocalRandom.nextInt(4,10) > 4) return ThreadLocalRandom.nextBoolean();
        break;
    case 8:
        if(ThreadLocalRandom.nextInt(3,10) > 3) return ThreadLocalRandom.nextBoolean();
        break;
    case 9:
        if(ThreadLocalRandom.nextInt(2,10) > 2) return ThreadLocalRandom.nextBoolean();
        break;
    case 10:
        if(ThreadLocalRandom.nextInt(1,10) > 1) return ThreadLocalRandom.nextBoolean();
        break;
}

正如你所看到的,我不知道我在做什么,所以我需要一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:2)

<强> 1。解释和解决方案:

您需要的是:

  • 生成0到10之间的随机数(使用Random类)
  • 根据charge的值,找到随机数的接受范围:
    • 示例:如果费用为4,则随机获取的错误为[0;7](范围的70%),因此return random >=7;
private static boolean isError(int charge) {
    int random = new Random().nextInt(10);
    switch (charge) {
        case 1:  return random >= 10;
        case 2:  return random >= 9;
        case 3:  return random >= 8;
        case 4:  return random >= 7;
        case 5:  return random >= 6;
        case 6:  return random >= 5;
        case 7:  return random >= 4;
        case 8:  return random >= 3;
        case 9:  return random >= 2;
        case 10: return random >= 1;
        default: return false;
    }
}

<强> 2。更短的解决方案

这可以简化为:

private static boolean isError(int charge) {
    return new Random().nextInt(10) >= (11 - charge);
}

第3。测试&amp;演示Demo

使用此main,您可以测试该方法的有效性,它会测试nbTest次,每次charge,并查看您收到错误的次数

public static void main(String[] args) {
    DecimalFormat df = new DecimalFormat("##.##%");
    double nbError, nbTest = 100000;
    for (int charge = 1; charge < 11; charge++) {
        nbError = 0;
        for (int j = 0; j < nbTest; j++) {
            nbError += (isError(charge) ? 0 : 1);
        }
        System.out.println(charge + " -> " + df.format(nbError / nbTest));
    }
}


1 -> 100   %   ~100%
2 ->  90,06%   ~ 90%
3 ->  80,31%   ~ 80%
4 ->  69,97%   ~ 70%
5 ->  59,92%   ~ 60%
6 ->  49,9 %   ~ 50%
7 ->  39,9 %   ~ 40%
8 ->  30,08%   ~ 30%
9 ->  19,84%   ~ 20%
10 -> 10,18%   ~ 10%

答案 1 :(得分:1)

一个简单的机制是根据费用计算0.01.0之间的值,然后将其与随机double进行比较。

public void test() {
    // Test each charge.
    for (int charge = 0; charge < 10; charge++) {
        // Using ints here so output is clearer - could just as easily use bool.
        List<Integer> results = new ArrayList<>();
        for (int test = 0; test <= 100; test++) {
            // Use 0 or 1 debending on random biased boolean.
            results.add(biasedBoolean(1.0 - ((float) charge / 10)) ? 0 : 1);
        }
        System.out.println("Charge " + (charge + 1) + " -> " + results);
    }
}

Random random = new Random();

private Boolean biasedBoolean(double bias) {
    return random.nextDouble() < bias;
}

您可能需要调整数学以确保获得有关您的值的正确统计信息,但这肯定会显示一种技术。