Розыгрыш с различными процент


у Меня есть система "открытого поля", которая работает следующим образом:

поле может иметь Х элементов (неограниченное количество), где каждый элемент будет иметь Y% выигрыша: # "или"#".1% (больше не имеет десятичных знаков)

: "окно" может быть не более 10 элементов, где:

  1. 0.5% chanca быть усиление
  2. 1% chanca быть усиление
  3. 4% chanca быть усиление
  4. 4.5% chanca быть усиление
  5. 5% chanca быть усиление
  6. 15% chanca быть усиление
  7. 15% chanca быть усиление
  8. 15% chanca быть усиление
  9. 20% chanca быть усиление
  10. 20% chanca быть усиление

Всегда сумма процентов, витория из пунктов будет 100% круглое

и в Настоящее время, я просто у меня есть простая функция, которая берет любой элемент массива из элементов, в коробке:

$vencedor = $items[array_rand($items)];

И он меня назад элемент "разыгран", что нужно, что процент каждого элемента есть приняты во внимание, и я не получаю, это

Попробовал несколько вещей, не достигли желаемого результата

Author: Everton Neri, 2018-07-16

1 answers

Решение, предлагаемое @bfavaretto в комментариях, работает идеально. Вот вам еще один совет, если не удалось решить.

Сделал решение на основе ряда чисел, каждый элемент может иметь. Чем выше процент шансов, тем больше диапазон чисел для каждого элемента. Основанный в вашем примере, я создал следующий массив:

$items = array(

    "Item 1" => 0.5, // porcentagens
    "Item 2" => 1,
    "Item 3" => 4,
    "Item 4" => 4.5,
    "Item 5" => 5,
    "Item 6" => 15,
    "Item 7" => 15,
    "Item 8" => 15,
    "Item 9" => 20,
    "Item 10" => 20

);

С этим, создается новый массив с именем каждого элемента и их диапазонов, с помощью этой код:

$valor = 1000; // valor do peso máximo e total dos itens
$inicio = 1;
$ultimo_valor = 0;

$array_elementos = array(); // array para sorteio

// cria o array para sorteio
foreach($items as $nome => $porcentagem){

    $val =  ($valor * $porcentagem) / 100;
    $valorFinal = $val + $inicio - 1;
    $array_elementos[$nome] = $inicio."-".$valorFinal;
    $inicio = $valorFinal + 1;

}

Посмотрите, как стало массив $array_elementos:

Array ( 

    [Item 1] => 1-5 
    [Item 2] => 6-15 
    [Item 3] => 16-55 
    [Item 4] => 56-100 
    [Item 5] => 101-150 
    [Item 6] => 151-300 
    [Item 7] => 301-450 
    [Item 8] => 451-600 
    [Item 9] => 601-800 
    [Item 10] => 801-1000 

)

Теперь просто случайным образом выберет случайное число и поиск в массиве, в котором элемент находится номер. Так:

// numero randômico "sorteio"
// de 1 até o valor máximo
$num_rand = rand(1, $valor);

$elemento_sorteado = "";

// procura o elemento sorteado
foreach($array_elementos as $nome => $peso){
    $valores = explode("-", $peso);
    if($num_rand >= $valores[0] && $num_rand <= $valores[1]){
        $elemento_sorteado = $nome;
        break;
    }
}

echo $elemento_sorteado;

Вот код, работает в ideone

 1
Author: Andrei Coelho, 2018-07-16 19:07:19