Создайте случайную переменную от 1 до 100 в соответствии с конкретным распределением, используя Node.js.

Используя Node.js, мы пытаемся придумать способ генерации случайного числа в диапазоне от 1 до 100. Однако вместо использования стандартного линейного распределения, такого как типичная функция RAND(), мы могли бы вместо этого использовать Weibull (или какое-то такое) распределение, которое даст длинный хвост и взвесит ответы в большей степени в сторону больших значений - например, значение от 75 до 100 может быть сгенерировано в 80% случаев, значение от 50 до 74 будет сгенерировано в 15% случаев. время, а остаток (‹ 20) генерировал 5% времени.

Мы нашли функцию случайной величины Вейбула, используя следующую формулу alpha*(-ln(1-X))^(1/beta). Предполагая, что X является стандартным линейным случайным числом от 0 до 1, используя альфа = 1, а бета ‹ = 1, кажется, мы получаем хорошее распределение, однако мы в тупике относительно того, как сгенерировать единственное значение, которое всегда будет находиться между 1 и 100.

Любые идеи или рекомендации приветствуются.


person Gatmando    schedule 19.02.2014    source источник
comment
Распределение Вейбулла определяется от 0 до бесконечности. Как вы думаете, вы поместите его в [1..100]?   -  person alex    schedule 20.02.2014
comment
почему бы вам просто не написать несколько функций, которые выводят в диапазоне случайных значений, например 75-100, и использовать другое случайное число, чтобы выбрать, какой диапазон использовать. если ваш самый редкий процент 5%, то генерируйте число от 1 до 20; 1-16=большой, 17=‹20,18+19+20=50-74 и т.д...   -  person dandavis    schedule 20.02.2014


Ответы (1)


Хорошо - на всякий случай, если кого-то заинтересует моя версия ответа. Использование следующей ссылки привело меня к моей цели ограничить набор результатов Weibull:

https://stats.stackexchange.com/questions/30303/how-to-simulate-data-that-satisfy-specific-constraints-such-as-having-specific-m

Также пригодились следующие ссылки:

http://en.wikipedia.org/wiki/Weibull_distribution

http://mathworld.wolfram.com/WeibullDistribution.html

В итоге мой черновой код node,js выглядит так:

var desiredMin = 1; //the desired minimum random result 
var desiredMax = 50; //the desired maximum random result 
var scale = 1; //Weibul scale parameter (1 provides an inverse result set)
var shape = 10; //Weibul shape parameter (how skewed the result set is)

//given an possible random range of {0,1} value calculate the minimum and maximum Weibull distribution values given current shape and scale parameters
var weibullMin = Math.pow((shape*scale), (-1*shape)) * Math.pow(.000001, shape -1) * Math.exp(Math.pow((.000001/scale), shape));
var weibullMax = Math.pow((shape*scale), (-1*shape)) * Math.pow(.999999, shape -1) * Math.exp(Math.pow((.999999/scale), shape));

//simulate 1000 random weibull values and write results to file
fileStream.once('open', function(fd) {
    for(var i = 1; i <= 1000; i++) {
        var r = Math.random();
        var weibullRandom = Math.pow((shape*scale), (-1*shape)) * Math.pow(r, shape-1) * Math.exp(Math.pow((r/scale), shape)); //generate Weibull random value
        var weibullRandomAdjusted = desiredMin + (desiredMax - desiredMin)*((weibullRandom-weibullMin) / (weibullMax - weibullMin)); //adjust Weibull random value so that it constrained into the desired min/max range
        fileStream.write(weibullRandomAdjusted + "\n");
    };
    fileStream.end();
});

Я запустил код для различных значений «формы», и он дает мне именно те результаты, которые мне нужны.

person Gatmando    schedule 21.02.2014