PHP случайный / процентный шанс сделать один из вариантов - PullRequest
1 голос
/ 01 мая 2020

Мне нужна ссылка, которая, если пользователь нажимает, генерирует случайное число, и затем сравнивается с этим числом операторов if, чтобы что-то сделать, например, например:

$value = rand(1,1000);

Тогда операторы if:

if ($value >= 1 && $value <= 10) {
// do something
} elseif ($value >= 11 && $value <= 20) {
// do something else
} .... etc

Каждый случайный щелчок / число будет относиться только к одному из операторов if, поэтому должен произойти только один вывод.

Это не кажется наиболее логичным / Самый простой способ сделать это. Не уверен, что лучший метод будет здесь. Кто-нибудь может указать мне правильное направление других методов для достижения чего-то вроде этого? Спасибо!

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Итак, что вам нужно, это пороги с обратными вызовами. Так что вам нужно создать массив порогов, которые имеют обратный вызов. Затем, когда вы генерируете ваше случайное число, вы просто перебираете пороги и сравниваете ваше случайное число с пороговым значением.

 $number = rand(1, 1000);

 $thresholds = [
    [10,function(){}],
    [20,function(){}],
    [30,function(){}]
 ];

 //now we can loop through each threshold with the random number.  As we only need to check the last highest value of each to know we passed the threshold.

 foreach($thresholds as $index=> $threshold){
   //we need to check if this is the last threshold first so we need to know what that is.   
   if(array_key_last($threshold) === $index){
      $threshold[1]();
      break;
   }

   //here we check if the number is greater than the threshold and also less than the next threshold. then call its callback.
   elseif($number >= $threshold[0] && $number < $thresholds[$index + 1][0]){
      $threshold[1]();
      break;
   }
0 голосов
/ 01 мая 2020

Вам понравилась идея функции, но вам нужны разные шансы. Это можно сделать с помощью поискового массива. Таким образом, у нас все еще есть эти функции:

function something1()
{
    // do something number 1
}

function something2()
{
    // do something number 3
}

function something3()
{
    // do something number 3
}

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

$events = ['something1' => 3,
           'something2' => 1,
           'something3' => 5];

Общая сумма этого массива равна 9, а something2 имеет Вероятность возникновения 1 к 9, something1 шанс 1 к 3 и something3 шанс 5 к 9.

Теперь нам все еще нужно вызвать функцию, используя эти шансы, что можно сделать следующим образом:

$total  = array_sum($events);
$number = rand(1, $total);
$sum    = 0;
foreach ($events as $functionName => $chance) {
    $sum += $chance;
    if ($sum >= $number) {
        $functionName();
        break;
    }
}
0 голосов
/ 01 мая 2020

Вы можете использовать оператор switch , например, так:

$numberOfSomethings = 5;

switch (rand(1,$numberOfSomethings)) {
    case 1: 
        // do something number 1
        break;
    case 2: 
        // do something number 2
        break;
    case 3: 
        // do something number 3
        break;
    case 4: 
        // do something number 4
        break;
    case 5: 
        // do something number 5
        break;
}

, но это очень похоже на ваш код.

Вы можете сделать что-то внутри функции, а затем вызвать случайную функцию:

function something1()
{
    // do something number 1
}

function something2()
{
    // do something number 3
}

function something3()
{
    // do something number 3
}

$functionName = "something".rand(1,3); // choose a function
$functionName(); // and call it

Кажется, что это легко расширить. Но я все еще думаю, что ваши цели не очень ясны.

...