当前位置: 首页 > 知识库问答 >
问题:

基于速率(概率)的选择

谭梓
2023-03-14

让我们假设我有一个这样的结构化数组:

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

我将这个结构称为“categories”,所以,我在这个数组中有六个类别。我的目标是根据一个类别随机挑选一个产品。

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

<?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

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

如果我这样做,我完全是在数学上和逻辑上说,我永远不会得到BCF,因为这些类别没有点击率(那时就没有切片了)

我如何避免这种情况?我必须给这些类别一些机会,但最小(这意味着不是不可能)。

共有2个答案

太叔烨霖
2023-03-14

这里有一个随机变量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永远不会发生。

羊柏
2023-03-14

你可以使用一个分发数组,它会让每个类别重复点击次数。然后你可以简单地从这个数组中得到一个随机元素。

不知怎的,是这样的:

$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];
 类似资料:
  • 我有以下代码片段: 我的问题是,它真的计算出25%的概率在这里获胜吗?球员在这里获胜的几率真的是25%吗? 编辑: 我刚刚写了这个: 它非常不准确。它从大约0.15到0.3。 但是当我做更多的检查时(从(i 这是为什么?为什么100张支票不够精确?

  • 我希望使用本文提供的答案从列表中随机选择独特的项目。 按照所描述的方法,在我的循环的每次迭代中,我都会生成一个概率值,它是当前项目从列表中被选中的概率百分比。 我需要知道的是,我如何使用这个百分比值来选择项目(或不选择)。 这是我拥有的代码,是

  • 在概率公理中,我们建立了“概率测度”的概念,并使用“面积”来类比。这是对概率的第一步探索。为了让概率这个工具更加有用,数学家进一步构筑了“条件概率”,来深入探索概率中包含的数学结构。我们可以考虑生活中常见的一个估计: 三个公司开发一块地。A占地20%,B占地30%,C占地50%。三个公司规划的绿地占比不同:A土地中40%规划为绿地,B土地中的30%规划为绿地,C土地中的10%规划为绿地。我想选择绿

  • 概率论早期用于研究赌博中的概率事件。赌徒对于结果的判断基于直觉,但高明的赌徒尝试从理性的角度来理解。然而,赌博中的一些结果似乎有矛盾。比如掷一个骰子,每个数字出现的概率相等,都是1/6。然而,如果有两个骰子,那么出现的2到12这些数字的概率却不相同。概率论这门学科正是为了搞清楚这些矛盾背后的原理。 早期的概率论是一门混合了经验的数学学科,并没有严格的用语。因此,概率论在数学的精密架构下,显得有些异

  • 问题内容: Python是否有标准函数根据输入的0到1之间的随机数概率输出True或False? 我的意思的例子: 上面的示例中,如果输入0.7,将以70%的概率返回True,以30%的概率返回false 问题答案:

  • 关于这些例子,你知道我如何实现概率吗。 应该在属性中循环 在顶部、右侧、底部和左侧循环以检索其成功率值 随机检索一个方向,根据它的成功率(也就是它的概率)与所有东西进行比较。概率越高的人被呼叫的几率越高 程序在setInterval内,每次interval循环时,都会打印值。我尝试了很多不同的方法,但我想不出来。 更新对于我目前遇到的实际问题。 您可以忽略“未找到”。它只是一个随机字符串。数字根据