Возьмите интервал генерации случайных чисел (от 0 до 99) и раскидайте сгенерированные числа по эквивалентным интервалам (0...69, 70...89, 90...99) - если число попало в опред. интервал, значит ширина интервала будет вероятностью попадания в него этого числа.
$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;
}
Чтобы в этом убедиться, повторите эксперимент, например, 1000 раз:
$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);
Если хотите эксплуатировать именно функцию array_rand(), то ей нужно предоставить такой массив:
$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);
Вес каждого элемента увеличивается путем его тиражирования пропорционально вероятности его выпадания.
Решение не будет отличаться от классики.