Skip to content

Instantly share code, notes, and snippets.

@fdcore
Last active September 27, 2017 23:32
Show Gist options
  • Save fdcore/02b6590e18437687ff2b1acb70d2c726 to your computer and use it in GitHub Desktop.
Save fdcore/02b6590e18437687ff2b1acb70d2c726 to your computer and use it in GitHub Desktop.
Функция случайности с приоритетом
<?php
/*
Функция случайности с приоритетом
@author Dmitriy Nyashkin
@param (array) arr - Array with priority key
@param (string) priority_key - Array key for use priority
@return array - single array
*/
function random_priority($arr, $priority_key = 'priority')
{
$keys = array();
foreach($arr as $key=>$val)
$keys = array_merge($keys, array_fill(0, intval($val[$priority_key]), $key));
return $arr[ $keys[ array_rand($keys) ] ];
}
?>
<pre>
<?php
$arr = array(
array("name" => "мусор", "priority" => 1),
array("name" => "среднее", "priority" => 2),
array("name" => "хорошее", "priority" => 3),
array("name" => "элита", "priority" => 4),
);
$arr2 = array();
for ($i=1; $i <= 10; $i++) {
$arr2[]=array("name" => "$i", "priority" => random_int(1, 100));
}
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
/*
Функция случайности с приоритетом
@author Dmitriy Nyashkin
@param (array) arr - Array with priority key
@param (string) priority_key - Array key for use priority
@return array - single array
*/
function random_priority($arr, $priority_key = 'priority')
{
$keys = array();
foreach($arr as $key=>$val)
$keys = array_merge($keys, array_fill(0, intval($val[$priority_key]), $key));
return $arr[ $keys[ array_rand($keys) ] ];
}
$time = -microtime(true);
// тестирование работы
echo '<h3>test 1</h3>';
$win_items = []; // массив побед
$inter = 100000; // число интераций теста (чем больше тем точнее)
for ($i=0; $i < $inter; $i++) {
$win = random_priority($arr)['name'];
if(isset($win_items[$win]))
$win_items[$win]++;
else
$win_items[$win] = 1;
}
ksort($win_items);
$total = 0;
foreach($win_items as $name => $count)
{
$total += ($count / $inter * 100);
echo $name . " " . ($count / $inter * 100). ' %' . PHP_EOL;
}
echo "<hr>Total $total%<br>";
$time += microtime(true);
$time2 = -microtime(true);
echo "Time: ",sprintf('%f', $time) . 's' . PHP_EOL;
echo 'Usage: '. convert(memory_get_usage(true)); // 123 kb
// тестирование работы
echo '<h3>test 2</h3>';
$win_items = []; // массив побед
$inter = 10000; // число интераций теста (чем больше тем точнее)
for ($i=0; $i < $inter; $i++) {
$win = random_priority($arr2)['name'];
if(isset($win_items[$win]))
$win_items[$win]++;
else
$win_items[$win] = 1;
}
ksort($win_items);
$total = 0;
foreach($win_items as $name => $count)
{
$total += ($count / $inter * 100);
echo $name . " - " . ($count / $inter * 100). ' %' . PHP_EOL;
}
echo "<hr>Total $total%<br>";
$time2 += microtime(true);
echo "Time: ",sprintf('%f', $time2) . 's' . PHP_EOL;
echo 'Usage: '. convert(memory_get_usage(true));
?>
</pre>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment