来自Wikipedia:
我尝试实现此公式,即使该公式基于使用均匀分布在(0,1)上的随机数并产生分数,而JavaScript中的Math.random却在[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.log(getRandomIntInclusivePareto(0, 1024));
什么公式(或者更好的代码)可以让我使用Math.random生成包含边界的随机Pareto整数?
我正在寻找这种API:
function getRandomParetoIntInclusive(min, max, alpha = 1)
答案 0 :(得分:1)
好的,首先代码中有一个错误,不能包含0,console.log(getRandomIntInclusivePareto(0, 1024)
不起作用。
第二,要获取整数,您必须计算整数和样本值作为离散分布的概率。您提供的公式和代码适用于 连续采样,不适用于离散Paretto。要进行离散采样, 您必须设置样本列表(或范围)及其概率。 我正在使用https://github.com/jacobmenick/sampling代码进行离散采样。 概率通过Paretto分布计算。只需从链接中复制代码,然后将其放在下面的代码片段顶部即可运行。
节点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.log("Testing Paretto");
var t = getRandomIntInclusivePareto(1, 10, 1.3);
console.log(t);