假设我有一个像这样的结构化数组:
[
'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)
之间选择一个随机数,并制作一些&#34;切片&#34;,例如:
0 .. 0.50 => A
0.50 .. 0.25 => D
0.75 .. 1 => E
如果随机数介于0
和0.50
之间,我会选择类别A
,如果在0.50
和0.75
之间,则{{1} },如果在D
和0.75
之间,那么1
当然是我现在正在做的事情。
如果我这样做,我完全在数学和逻辑上说我永远不会得到E
,B
或C
,因为没有点击在那些类别上(当时没有切片。)
我怎能避免这种情况?我必须给这些类别一些机会,但是很少(这意味着并非不可能)。
答案 0 :(得分:2)
您可以使用分发数组,每个类别重复hits
次。然后你可以简单地从该数组中获取一个随机元素。
不知怎的这样:
$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];
答案 1 :(得分: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永远不会发生。