@blvckmania

Как реализовать шанс выпадения того или иного?

Как лучше на PHP реализовать выпадение чего-либо?
Допустим, мы имеет таблицу, где прописаны шансы выпадения предмета, например. У первой строки шанс 10%, а у другой 0.5% или 0.25%.
Присваивать числа, а потом рандомить через rand() можно, но что делать с дробными числами, как 0.25%?
Подобное видел в сайтах-рулетках для CS:GO - пример
  • Вопрос задан
  • 1427 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
<?php

function numberOfDecimals($value)
{
    if ((int)$value == $value)
    {
        return 0;
    }
    else if (! is_numeric($value))
    {
        // throw new Exception('numberOfDecimals: ' . $value . ' is not a number!');
        return false;
    }

    return strlen($value) - strrpos($value, '.') - 1;
}

function roulette($items)
{
	$sumOfPercents = 0;
	foreach($items as $itemsPercent)
	{
		$sumOfPercents += $itemsPercent;
	}

	$decimals = numberOfDecimals($sumOfPercents);
	$multiplier = 1;
	for ($i=0; $i < $decimals; $i++) 
	{ 
		$multiplier *= 10;
	}

    $sumOfPercents *= $multiplier;
	$rand = rand(1, $sumOfPercents);
	//echo "max percent = {$sumOfPercents}\n";
	//echo "rand = $rand\n";
	
	$rangeStart = 1;
	foreach($items as $itemKey => $itemsPercent)
	{
		$rangeFinish = $rangeStart + ($itemsPercent * $multiplier);
		//echo "$itemKey in [$rangeStart, $rangeFinish]\n";
		if($rand >= $rangeStart && $rand <= $rangeFinish)
		{
			return $itemKey;
		}

		$rangeStart = $rangeFinish + 1;
	}

}


$items = array('item-1' => 0.25, 'item-2' => 0.5, 'item-3' => 5, 'item-4' => 4.25333);
echo roulette($items);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы