使用 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/2
, 1/3
旁边的下一个,依此类推,直到达到 1/n
。
然后您可以只使用 codetheory 中的代码并插入您的元素权重数组(作为键值对象,就像他们在那里做的那样)而不是他们在 random_check
中的数组,您就完成了。
我希望构建一个 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/2
, 1/3
旁边的下一个,依此类推,直到达到 1/n
。
然后您可以只使用 codetheory 中的代码并插入您的元素权重数组(作为键值对象,就像他们在那里做的那样)而不是他们在 random_check
中的数组,您就完成了。