Php 概率百分比

Php 概率百分比,php,probability,strategy-pattern,Php,Probability,Strategy Pattern,这实际上更多的是一个方法问题,但我将用php介绍它 假设我们有一个列表,其中包含给定事件在迭代中发生的四个百分比 array=('walk the dog'=>.25,'read the paper'=>.25,'drink coffee'=>.0,'listen to music'=>.50) (键只是测试-在实践中,这将用于策略模式中,该模式使用call\u user\u func() 在一个循环中,考虑到这些事件各自的权重,通过随机调整选择其中一个事件的最佳方式是

这实际上更多的是一个方法问题,但我将用php介绍它

假设我们有一个列表,其中包含给定事件在迭代中发生的四个百分比

array=('walk the dog'=>.25,'read the paper'=>.25,'drink coffee'=>.0,'listen to music'=>.50)
(键只是测试-在实践中,这将用于策略模式中,该模式使用
call\u user\u func()

在一个循环中,考虑到这些事件各自的权重,通过随机调整选择其中一个事件的最佳方式是什么(即,对于这种特定的配置,将有大量的音乐听,而不是大量的咖啡喝)

目前我有一些类似于:

for($i=1;$i<=3;$i++){
  $rand = 1/rand(1,10);
  //choose from the list
}
$arr = array (
    'walk the dog'    =>  array('min' =>  0, 'max' =>  25),
    'read the paper'  =>  array('min' => 25, 'max' =>  50),
    'drink coffee'    =>  array('min' =>  0, 'max' =>   0),
    'listen to music' =>  array('min' => 50, 'max' => 100),
);

$rnd = rand(1,100);
foreach($arr as $k =>$v) {
    if ($rnd > $v['min'] && $rnd <= $v['max']) {
        echo $k,"\n";
    }
}
for($i=1;$i
$arr=array('walk the dog'=>25,'read the paper'=>25,'listen music'=>50);
$rand=兰特(1100);
$sum=0;
$action='';
foreach($arr为$k=>$v){
$sum.=$k;

如果($sum),您是否考虑过使用百分比值作为累积数

$array = array('walk the dog'=>.25,'read the paper'=>.25,'drink coffee'=>.0,'listen to music'=>.50);

$rand = rand();
$cur = 0;
foreach ($key=>$val in $array) {
  $cur += $val;
  if ($rand <= $cur)
    return $key;
}
$array=array('walk the dog'=>.25,'read the paper'=>.25,'weak coffee'=>.0,'listen music'=>.50);
$rand=rand();
$cur=0;
foreach($key=>$val,在$array中){
$cur+=$val;

如果($rand,您可以以这样一种方式重新构造数组:事件以降低的概率存储(为了性能),与事件对应的值是该特定事件的概率加上前一个元素的值(这意味着最后一个元素的值始终为1)

然后您只需迭代数组并返回其值大于$rand的事件。

我将执行以下操作:

for($i=1;$i<=3;$i++){
  $rand = 1/rand(1,10);
  //choose from the list
}
$arr = array (
    'walk the dog'    =>  array('min' =>  0, 'max' =>  25),
    'read the paper'  =>  array('min' => 25, 'max' =>  50),
    'drink coffee'    =>  array('min' =>  0, 'max' =>   0),
    'listen to music' =>  array('min' => 50, 'max' => 100),
);

$rnd = rand(1,100);
foreach($arr as $k =>$v) {
    if ($rnd > $v['min'] && $rnd <= $v['max']) {
        echo $k,"\n";
    }
}
$arr=array(
“遛狗”=>数组('min'=>0,'max'=>25),
'阅读文章'=>数组('最小'=>25,'最大'=>50),
“喝咖啡”=>数组('min'=>0,'max'=>0),
'听音乐'=>阵列('最小'=>50,'最大'=>100),
);
$rnd=兰特(1100);
foreach($arr为$k=>$v){

如果($rnd>$v['min']&&&$rnd,您的列表中有4项,顺便说一句,不是3项。这是我或多或少希望应用的,但问题是从列表中选择正确的一项。因为任何一个循环过程都有四个潜在事件(如果我们折扣咖啡,因为它在此配置中设置为零,则为3项)。这些键的总和总是100吗(或1)是的,添加到列表中的新数字会降低其他数字出现的概率。它们加在一起将始终等于1(如果按该比例计算,则等于100)。我认为您可能有一个错别字,将$k替换为$v,但是的,这确实有效。如果不使用,生成随机数有什么意义?