首页 文章

基于速率(概率)的选择

提问于
浏览
0

我们假设我有一个结构化数组:

[
  'A' => 2,
  'B' => 0,
  'C' => 0,
  'D' => 1,
  'E' => 1,
  'F' => 0
]

我将这个结构称为“类别”,因此,我在这个数组中有六个类别 . 我的目标是选择一个基于类别的随机产品 .

我想做一个基于速率的类别选择,据我所知,我必须计算这个类别在数组中代表的百分比,例如:

<?php

// ...

$total = array_sum($a);

array_map(function ($hits) use ($total) {
  return $hits / $total;
}, ...);

这会给我这样的东西:

(
    [A] => 0.5  (50%)
    [B] => 0
    [C] => 0
    [D] => 0.25 (25%)
    [E] => 0.25 (25%)
    [F] => 0
)

好的,现在我必须做一个简单的算法来根据这些费率获得类别;我想我现在需要在范围 (0, 1) 之间选择一个随机数,并制作一些"slices",例如:

0    .. 0.50   => A
0.50 .. 0.25   => D
0.75 .. 1      => E

如果随机数介于 00.50 之间,我会选择类别 A ,如果介于 0.500.75 之间然后 D ,如果介于 0.751 之间,那么 E 当然是我现在正在做的事情 .

问题

如果我走这条路,我'm totally saying mathematically and logically that I'永远不会得到 BC 也不会 F ,因为这些类别没有命中(当时没有切片 . )

我怎么能避免这个?我必须给这些类别一些机会,但是最小(这意味着并非不可能) .

2 回答

  • 1

    你所拥有的是一个随机变量X,它将采用S = {A,B,C,D,E,F}中的一个值 .

    P(X = A)= 1/2
    P(X = B)= 0
    等等

    定义一个新的均匀随机变量Y,其中P(Y = A)= P(Y = B)= ... = P(Y = F)= 1 / | S |如果T = 0,则随机变量Z = X,如果T = 1则Z = Y,其中T是伯努利随机变量,其中P(T = 1)= t且P(T = 0)= 1-t .

    然后对于S中的所有s,

    P(Z = s)= P(Z = s | T = 0)P(T = 0)P(Z = s | T = 1)P(T = 1)=(1-t)P(X = s )t / | S |

    使用此模型,您需要选择的是[0,1]中的参数t,其中t表示从S中均匀随机选择的概率.t = 0是您当前的模型,其中B,C和F将永远不会发生

  • 2

    您可以使用分发数组,每个类别重复_320070次 . 然后你可以简单地从该数组中获取一个随机元素 .

    不知何故这样:

    $distr = array();
    array_walk($a, function ($hits, $cate) use ($distr) {
      $distr = array_merge($distr, array_fill(0, $hits, $cate));
    });
    
    $index = mt_rand(0, count($distr) - 1);
    $random_cate = $distr[$index];
    

相关问题