在 Java 中生成离散随机变量?

Generating a discrete random variable in Java?

今天面试他们问我这个问题?如何在Java中生成离散随机变量?我做不到,但我想知道解决方案。 他们给了我一个数组:

double[] probabilities={.2,.1,.3,.4};
double[] outcomes ={4,5,8,11.5};

这应该给出答案:

double discreteRV = problem.randPMF(probabilities,outcomes);

我无法理解如何解决这个问题。

由于所有概率总和为 1,您可以生成一个介于 0 和 1 之间的随机数,然后遍历概率并减去它们。当数字小于或等于0时,最后减去概率的索引为结果的索引:

import java.util.Random;
public static double randPMF(double[] prob, double[] out) {
    double rand = Math.random();
    int index = -1;
    while (rand >= 0) {
        index++;
        rand -= prob[index];
    }
    return out[index];
}

这是我的解决方案:

private double randPMF(double[] probabilities, double[] outcomes) {
    double random = Math.random();
    double p = 0;
    for (int i = 0; i < probabilities.length; i++) {
        p += probabilities[i];
        if (random < p) {
            return outcomes[i];
        }
    }
    return outcomes[outcomes.length - 1];
}

这是我想出来的

    private static double randPMF(double[] probabilities, double[] outcomes) {
        int n = 10;
        boolean nNotFound;
        for (double probability: probabilities){
            nNotFound = true;
            while(nNotFound)
            if (probability*n == (double)((int)(probability*n)))
                break;
            else
                n *= 10;
        }
        double[] numbers = new double[n];
        //j tracks the probability/occurence
        int j;
        //k tracks the new array
        int k = 0;
        //i tracks each element in our old arrays
        for (int i = 0; i<probabilities.length; i++) {
            j = 0;
            while (j < (probabilities[i]*n)) {
            numbers[k] = outcomes[i];
            k++;
            j++;
            }
        }
        int index = new Random().nextInt(n);
        System.out.println(numbers.length);
        return numbers[index];
    }