在 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];
}
今天面试他们问我这个问题?如何在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];
}