php 百分比机会

Dea*_*ado 3 php probability strategy-pattern

这实际上更多的是一个方法问题,但我用 php 来呈现它。

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

array=('walk the dog'=>.25,'read the paper'=>.25,'drink coffee'=>.0,'listen to music'=>.50)
Run Code Online (Sandbox Code Playgroud)

(键只是测试 - 实际上,这将在策略模式中使用,该策略模式将不同的方法应用于偶然使用的对象call_user_func()

在一个循环中,通过随机调整的选择来选择这些事件之一的最佳方式是什么,考虑到它们各自的权重(IE,对于这个特定的配置,将会听到很多音乐而不是很多咖啡喝了)

目前我有类似的东西:

for($i=1;$i<=3;$i++){
  $rand = 1/rand(1,10);
  //choose from the list
}
Run Code Online (Sandbox Code Playgroud)

但这需要将百分比映射到值范围(50-100% 为听音乐,0-25% 为遛狗,25-50 为阅读论文),因为该迭代的“值”是作为浮点数计算的0 到 1 之间。这改变了需要记录百分比的方式。

是否有任何一种方法可以将值的身份保留为应选择的真实概率而不是范围?这肯定会使代码更加可配置,因为我必须使这些值可调。如果我说得太含糊,请告诉我。

Tot*_*oto 5

我会做类似的事情:

$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";
    }
}
Run Code Online (Sandbox Code Playgroud)