Я почти уверен, что его не существует, но довольно легко создать функцию, которая будет создавать такие образцы. Во-первых, Java поставляется с генератором случайных чисел, в частности, с функцией Random.nextDouble()
, которая может создавать случайные удвоения в диапазоне от 0,0 до 1,0.
import java.util.Random;
double someRandomDouble = Random.nextDouble();
// This will be a uniformly distributed
// random variable between 0.0 and 1.0.
Если у вас есть выборка с заменой, если вы конвертируете pdf, который у вас есть в качестве входных данных, в cdf, вы можете использовать случайные двойники, которые предоставляет Java, для создания случайного набора данных, увидев, в какую часть cdf он попадает. Итак, сначала вам нужно преобразовать pdf в cdf.
int [] randsample(int[] values, int numsamples,
boolean withReplacement, double [] pdf) {
if(withReplacement) {
double[] cdf = new double[pdf.length];
cdf[0] = pdf[0];
for(int i=1; i<pdf.length; i++) {
cdf[i] = cdf[i-1] + pdf[i];
}
Затем вы создаете массив целых чисел правильного размера для хранения результата и начинаете находить случайные результаты:
int[] results = new int[numsamples];
for(int i=0; i<numsamples; i++) {
int currentPosition = 0;
while(randomValue > cdf[currentPosition] && currentPosition < cdf.length) {
currentPosition++; //Check the next one.
}
if(currentPosition < cdf.length) { //It worked!
results[i] = values[currentPosition];
} else { //It didn't work.. let's fail gracefully I guess.
results[i] = values[cdf.length-1];
// And assign it the last value.
}
}
//Now we're done and can return the results!
return results;
} else { //Without replacement.
throw new Exception("This is unimplemented!");
}
}
Есть некоторая проверка ошибок (убедитесь, что массив значений и массив pdf имеют одинаковый размер) и некоторые другие функции, которые вы можете реализовать, перегрузив это, чтобы предоставить другие функции, но, надеюсь, вам этого достаточно для начала. Ваше здоровье!
person
cactus1
schedule
31.12.2013