使用 Zipf 分布曲线的加权随机

Weighted random using Zipf's distribution curve

我希望构建一个 JavaScript 函数,该函数包含 returns 个随机元素,但基于 Zipf 的分布曲线:
https://en.wikipedia.org/wiki/Zipf%27s_law

我看过这个:
http://codetheory.in/weighted-biased-random-number-generation-with-javascript-based-on-probability/

有点接近,但我想使用一种更简单的方法,使用基于 Zipf 分布曲线的数学公式。

考虑:

['kiwi', 'banana', 'orange', 'apple', 'pear', 'mango', .... etc]

所以基本上,如果我们从上面的数组中随机挑选 10,000 个水果,我们将得到这个分布:

第一个点是奇异果,第二个点是橙色等等。

看来你想实现 s=1 的 Zipf 定律的最简单情况。这意味着您可以简单地获取数组长度为 n 的调和级数的元素,并将数组的第一个元素的权重设置为 1,然后是 1/21/3 旁边的下一个,依此类推,直到达到 1/n

然后您可以只使用 codetheory 中的代码并插入您的元素权重数组(作为键值对象,就像他们在那里做的那样)而不是他们在 random_check 中的数组,您就完成了。