[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP задания для практики
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
Invis1ble
Тест для всех представленных работ
<?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 | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.