процентный шанс php - PullRequest
       8

процентный шанс php

2 голосов
/ 10 января 2012

Это действительно больше вопрос подхода, но я представляю его в php.

Предположим, у нас был список из четырех процентов того, что на итерации будет происходить событие Give.

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

(Ключи - это просто тесты - на практике это будет использоваться в шаблоне стратегии, который применяет различные методы к случайному объекту, используя call_user_func())

В цикле, что было бы лучшим способом выбрать одно из этих событий путем случайной корректировки выбора с учетом их соответствующих весов (т. Е. Для этой конкретной конфигурации будет прослушиваться много музыки, а не много кофе выпил)

В настоящее время у меня есть что-то вроде:

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

Но для этого потребуется сопоставить проценты с диапазонами значений (50-100% становятся слушающими музыку, 0-25% выгуливают собаку и 25-50 читают газету), поскольку «значение» для этой итерации рассчитывается как Число с плавающей запятой от 0 до 1. Этот тип изменяет способ записи процентов.

Существует ли какой-либо подход, который бы сохранял идентичность значений в качестве реальной вероятности их выбора, а не диапазонов? Это определенно сделало бы код более настраиваемым, так как я должен сделать эти значения регулируемыми. Пожалуйста, дайте мне знать, если я был слишком расплывчатым.

Ответы [ 4 ]

4 голосов
/ 10 января 2012

Я бы сделал что-то вроде:

$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";
    }
}
2 голосов
/ 10 января 2012

Рассматривали ли вы использование процентных значений в качестве кумулятивного числа?

$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;
}

Это предполагает, что значения в массиве составляют до 1. Порядок не имеет значения либо ...

1 голос
/ 10 января 2012
$arr = array('walk the dog'=>25,'read the paper'=>25,'listen to music'=>50);
$rand = rand(1,100);
$sum = 0;
$action = '';

foreach ($arr as $k => $v) {
    $sum .= $k;
    if ($sum <= $k)
        $action = $v;
}

Удалены те, у которых значение ключа равно нулю, и умножено значение ключа на 100, чтобы сделать его более читабельным.

0 голосов
/ 10 января 2012

Вы можете реструктурировать массив таким образом, чтобы события сохранялись с уменьшающейся вероятностью (для производительности), а значение, соответствующее событию, является вероятностью этого конкретного события плюс значение предыдущего элемента (что означаетпоследний элемент всегда будет иметь значение 1.).

Затем вы просто перебираете массив и возвращаете событие, для которого его значение больше $ rand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...