Из Википедия:
Я попытался реализовать эту формулу, хотя она основана на использовании случайного числа, равномерно распределенного по (0,1), и производит дроби, в то время как Math.random в JavaScript создает числа по [0,1), и я ищу целые числа без успеха:
function getRandomIntInclusivePareto(min, max, alpha = 1) {
const u = Math.random();
const x =
(-(
(u * max ** alpha - u * min ** alpha - max ** alpha) /
(max ** alpha * min ** alpha)
)) ** -(1 / alpha);
return x;
}
console.info(getRandomIntInclusivePareto(0, 1024));Какая формула (или, еще лучше, код) позволит мне сгенерировать инклюзивно ограниченное случайное целое число Парето, используя Math.random?
Я ищу такой API:
function getRandomParetoIntInclusive(min, max, alpha = 1)
Я добавил ссылку на исходную статью в Википедии; это то, что вы должны делать каждый раз, когда цитируете другую статью в Интернете, но особенно для контента, лицензированного в соответствии с Лицензия Creative Commons Attribution-ShareAlike 3.0, как контент в Википедии (как и содержимое Stack Overflow).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо, во-первых, в вашем коде есть ошибка, у вас не может быть включительно 0, console.info(getRandomIntInclusivePareto(0, 1024) не будет работать.
Во-вторых, чтобы получить целое число, вы должны вычислить вероятности для целых и выборочных значений в виде дискретного распределения. Предоставленные вами формулы и код предназначены для непрерывная выборка, она не будет работать для дискретного Паретто. Чтобы сделать дискретную выборку, вы должны установить список (или диапазон) образцов с их вероятностями. Я использую код https://github.com/jacobmenick/sampling для дискретной выборки. Вероятности вычисляются с помощью распределения Паретто. Просто скопируйте код из ссылки и поместите его поверх фрагмента кода ниже, чтобы запустить.
Узел 12.1, x64 Win10
function getRandomIntInclusivePareto(min, max, alpha = 1.0) {
var probabilities = []; // probabilities
for (var k = min; k <= max; ++k) {
probabilities.push(1.0/Math.pow(k, alpha)); // computed according to Paretto
} // would be normalized by SJS
var disc = SJS.Discrete(probabilities); // discrete sampler, returns value in the [0...probabilities.length-1] range
q = disc.draw() + min; // back to [min...max] interval
return q;
}
console.info("Testing Paretto");
var t = getRandomIntInclusivePareto(1, 10, 1.3);
console.info(t);
Что вы пробовали? Покажите нам код