【发布时间】:2014-07-26 12:48:41
【问题描述】:
假设我有一个这样的结构化数组:
[
'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) 范围内选择一个随机数,并制作一些“切片”,例如:
0 .. 0.50 => A
0.50 .. 0.25 => D
0.75 .. 1 => E
如果随机数在0和0.50之间,我会选择类别A,如果在0.50和0.75之间,那么D,如果在0.75和1之间,那么E,当然是我现在正在做的事情。
问题
如果我这样做,我完全从数学和逻辑上说,我永远不会得到B、C 或F,因为这些类别没有命中(那时没有切片。)
如何避免这种情况?我必须给这些类别一些机会,但很少(这意味着并非不可能)。
【问题讨论】:
-
嗯,你可以 f.e.将
1的值添加 到您的第一个数组中的每个类别值……这意味着A之后将具有3的值,b将具有1,等等……这将阻止您的空类别在以后产生空的“切片”。 -
如果您认为过于强调空类别,那么选择不同的“算法” – f.e. 将每个值乘以
2、5或10,之前加上1;这将更加强调那些一开始就不是空的类别。我建议你进行一些不同变化的测试运行,假设每个 10.000 次“平局”——然后你查看结果并找出哪个版本给出了你“最喜欢”的结果…… -
扩展@CBroe 所说的内容,您可以使用公式
(coefficient) = 1.0 / ( (sum of categories) * (minimal probability) )来选择特定的最小概率。尽管可能仍需要进行实验。
标签: php math probability rate