从数组中返回一个随机值,其概率与其值成正比
我有一个数组,就像
$keywords = array('apple'=>10,'orange'=>2,'grape'=>12);
我想从数组中随机选择一个“键”。然而,概率分布应该是这样的:选择一个元素的概率应该与其值成正比。
I have an array like
$keywords = array('apple'=>10,'orange'=>2,'grape'=>12);
I want to randomly pick one of the "Key" from the array. However the probability distribution should be such that probability of picking an element should be proportional to it's value.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
将所有值相加(10+2+12 为 24);获取 [0, 24) 范围内的随机数,并根据该数字是否在 [0, 10)、[10, 12) 或 [12, 24) 中选择相应的元素。
Add all values (10+2+12 is 24); get a random number in the range [0, 24), and pick the corresponding element depending on whether the number lies in [0, 10), [10, 12), or [12, 24).
我会这样做:
I'd do it like this:
O(log(n)) 方法(这是直接从一个非常相似的问题的答案中摘录的)
:技术是将数组转换为累积和数组:
在从零到累积总数的范围内选择一个随机数(在示例中:
0 <= x < 100
)。然后,对累积数组使用 二分 来定位原始数组中的索引:例如,如果随机变量 x 为 4,则将累积数组一分为二会得到位置索引 0,它对应于原始数组中的 10。
并且,如果随机变量 x 为 72,则将累积数组一分为二会得到位置索引 2,它对应于原始数组中的 5。
An O(log(n)) approach (this is ripped directly from an answer to a very similar question):
The usual technique is to transform the array into an array of cumulative sums:
Pick a random number in the range from zero up to the cumulative total (in the example:
0 <= x < 100
). Then, use bisection on the cumulative array to locate the index into the original array:For example, if the random variable x is 4, bisecting the cumulative array gives a position index of 0 which corresponds to 10 in the original array.
And, if the random variable x is 72, bisecting the cumulative array gives a position index of 2 which corresponds to 5 in the original array.