Тест для всех представленных работ
<?php
error_reporting(E_ALL | E_STRICT);
header('Content-Type: text/html; charset=utf-8');
set_time_limit(0);
function SoMeOnE_getProbability($probability)
{
$rand = rand(1,100);
$list = array();
$start = 0;
$end = 0;
$i = 1;
foreach ($probability as $k=>$item) {
$end = $end + $item*100;
for ($start; $start<=$end; $start++) {
$list[$i]['number'][] = $start;
}
$list[$i]['key'] = $k;
$start = $start - 1;
$i++;
}
foreach ($list as $item) {
if (in_array($rand, $item['number'])) {
$result = $item['key'];
}
}
return $result;
}
function alive_getProbability($array_in, $precisely = 100)
{
//
$j=0;
$result = 'event0';
$n=$precisely*array_sum($array_in);
$prob = rand(1,$n);
foreach ($array_in as $k=>$item)
{
$j = $j + $precisely*$item;
if($j >= $prob)
{
$result = $k;
break;
}
}
return $result;
}
function twin_getProbability($array)
{
$out = array();
foreach($array as $k => $v)
{
$tmp = array_fill(0, $v * 100, $k);
$out = array_merge($out, $tmp);
}
return $out[array_rand($out)];
}
function kirik_getProbability($array) {
$rnd = rand(0, 100);
$pv = 0;
$ev = '';
foreach($array as $k => $v) {
$v *= 100;
$ev = $k;
if($rnd > $pv && $rnd <= $v + $pv) {
break;
}
$pv += $v;
}
return $ev;
}
function Invis1ble_getProbability($events)
{
while (true)
{
$r = array_rand($events);
if (mt_rand(1, 1000000) <= $events[$r] * 1000000)
return $r;
}
}
$programmers = array(/*'SoMeOnE',*/ 'alive', /*'twin',*/ 'kirik', 'Invis1ble');
$events = array('event1' => .5, 'event2' => .25, 'event3' => .2, 'event4' => .0425, 'event5' => .0075);
$iterate = 100000;
echo $iterate . ' итераций<br />';
foreach ($programmers as $programmer)
{
echo '-----------------------------------------------------------------<br />';
echo $programmer . '<br />';
$funcName = $programmer . '_getProbability';
$start = microtime(true);
$stats = array();
for ($i = 0; $i < $iterate; ++ $i)
{
$event = $funcName($events);
$stats[$event] = isset($stats[$event]) ? $stats[$event] + 1 : 1;
}
echo sprintf('Время выполнения %.5f сек<br />', microtime(true) - $start);
echo '<table style="font-size:14px"><tr><th>Событие</th><th>дано</th>&a mp;l t;th>результат</th><th>отклонение</th></tr>';
foreach ($stats as $event => $cnt)
{
$proc = 100 * $cnt / $iterate;
echo '<tr><td>' . $event . '</td>
<td>' . ($events[$event] * 100) . '%</td>
<td>' . $proc . '%</td>
<td>' . ($proc / $events[$event] - 100) . '%</td></tr>';
}
echo '</table>';
}
SoMeOnE, - нотайсы,
twin - warning'и и notice
alive, kirik - прикольно, но результат приемлем только с "часто наступающими" событиями, для очень редких наблюдается сильное отклонение. Хотя у alive насколько я понял можно регулировать вторым параметром, у kirik'а прийдется лезть в код и вручную править.
Из своего класса я сделал одну ф-цию, дабы не давать фору по времени :)
PS. Движок форума ломает тег <th> в конце листинга ;)
_____________
Профессиональная разработка на заказ
Я на GitHub | второй профиль