Php 概率百分比
这实际上更多的是一个方法问题,但我将用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() 在一个循环中,考虑到这些事件各自的权重,通过随机调整选择其中一个事件的最佳方式是
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,但是的,这确实有效。如果不使用,生成随机数有什么意义?