从数组中返回一个随机值,其概率与其值成正比

发布于 2024-12-18 02:15:08 字数 165 浏览 0 评论 0原文

我有一个数组,就像

$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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我的痛♀有谁懂 2024-12-25 02:15:08

将所有值相加(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).

心清如水 2024-12-25 02:15:08

我会这样做:

    $probabilities = array('apple'=>50, 'orange'=>20, 'banana'=>10);

    function random_probability($probabilities) {
      $rand = rand(0, array_sum($probabilities));
      do {
        $sum = array_sum($probabilities);
        if($rand <= $sum && $rand >= $sum - end($probabilities)) {
          return key($probabilities);
        }
      } while(array_pop($probabilities));
    }

I'd do it like this:

    $probabilities = array('apple'=>50, 'orange'=>20, 'banana'=>10);

    function random_probability($probabilities) {
      $rand = rand(0, array_sum($probabilities));
      do {
        $sum = array_sum($probabilities);
        if($rand <= $sum && $rand >= $sum - end($probabilities)) {
          return key($probabilities);
        }
      } while(array_pop($probabilities));
    }
少女七分熟 2024-12-25 02:15:08

O(log(n)) 方法(这是直接从一个非常相似的问题的答案中摘录的)

:技术是将数组转换为累积和数组:

 [10 60 5 25]  --> [10 70 75 100]

在从零到累积总数的范围内选择一个随机数(在示例中:0 <= x < 100)。然后,对累积数组使用 二分 来定位原始数组中的索引:

Random variable x      Index in the Cumulative Array      Value in Original Array
-----------------      -----------------------------      ----------------------
 0 <= x < 10                      0                            10
10 <= x < 70                      1                            60
70 <= x < 75                      2                             5
75 <= x < 100                     3                            25 

例如,如果随机变量 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:

 [10 60 5 25]  --> [10 70 75 100]

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:

Random variable x      Index in the Cumulative Array      Value in Original Array
-----------------      -----------------------------      ----------------------
 0 <= x < 10                      0                            10
10 <= x < 70                      1                            60
70 <= x < 75                      2                             5
75 <= x < 100                     3                            25 

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文