$block_array = array('One','Two','Three');
$rand = $block_array[array_rand($block_array)];
<?php
$values = [
['value' => 'One', 'weight' => 20],
['value' => 'Two', 'weight' => 30],
['value' => 'Three', 'weight' => 50]
];
function randByWeight(array $arr) {
$max = 0;
$result = [];
foreach($arr as $value) {
$rand = pow((mt_rand() / (mt_getrandmax() + 1)), 1/$value['weight']);
if ($rand > $max) {
$max = $rand;
$result = $value;
}
}
return $result;
}
// Например: 'Three' выпадет в 50% случаев, тк его вес -- половина от суммы всех весов
// Например: 'Two' выпадет в 30% случаев, тк его вес -- 30% от суммы всех весов
var_dump(randByWeight($values));
SELECT * FROM table ORDER BY POWER(random(), 1/weight) DESC LIMIT 1
<?php
$values = [
['value' => 'One', 'weight' => 20],
['value' => 'Two', 'weight' => 30],
['value' => 'Three', 'weight' => 50]
];
function randByWeight(array $items) {
$sum = array_reduce($items, function(int $acc, array $item): int {
return $acc += $item['weight'];
}, 0);
$rand = (mt_rand() / (mt_getrandmax() + 1)) * $sum;
foreach($items as $item) {
if($rand < $item['weight']) {
return $item;
}
$rand -= $item['weight'];
}
}
// Например: 'Three' выпадет в 50% случаев, тк его вес -- половина от суммы всех весов
// Например: 'Two' выпадет в 30% случаев, тк его вес -- 30% от суммы всех весов
var_dump(randByWeight($values));
$rnd_number = rand(0, 99);
switch(true)
{
case $rnd_number < 70:
echo "One";
break;
case $rnd_number >= 70 && $rnd_number < 90:
echo "Two";
break;
case $rnd_number >= 90:
echo "Three";
break;
}
$counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
for($i = 0; $i < 1000; $i++)
{
$rnd_number = rand(0, 99);
switch(true)
{
case $rnd_number < 70:
$counter["One"]++;
break;
case $rnd_number >= 70 && $rnd_number < 90:
$counter["Two"]++;
break;
case $rnd_number >= 90:
$counter["Three"]++;
break;
}
}
var_dump($counter);
$block_array = array('One','One','One','One','One','One','One','Two','Two','Three');
$counter = array('One'=> 0, 'Two' => 0, 'Three' => 0);
for($i = 0; $i < 1000; $i++)
{
$gen_value = array_rand($block_array);
$counter[$gen_value]++;
}
var_dump($counter);
$items_set = array();
foreach ( $items as $item_id => $item ) {
for ( $i = 0; $i < $item['chance']; $i ++ ) {
$items_set[] = $item_id;
}
}
$rand_id = $items_set[array_rand( $items_set )];
$rand_item = $items[$rand_id];
return $rand_item["id"];
<?php
$a=['1','2','3'];
foreach(range(1,100) as $i)
switch ($s=random_int ( 1 , 100 )) {
case $s<=10:echo $a[2];break;//10%
case $s>=81:echo $a[1];break;//20%
default: echo $a[0];//70%
}
2121121311211212211131111111111111111111211112112211113211111112111111111311111121111112211112211212