Уникальное целое число из массива при каждом обновлении (из предыдущего) с использованием $ _SESSION - PullRequest
1 голос
/ 24 сентября 2019

Мне нужно, чтобы пользователь всегда получал уникальное целое число, а не то, что было возвращено предыдущим при последнем обновлении браузера.

$count = count($page->images) - 1;
for ($i=0; $i<$count; $i++) {

    $randomIndex = rand(0, $count);

    if ($session->get("randomImage") && $session->get("randomImage") == $randomIndex) {
        $i = 0;
        continue;
    }
}
$session->set("randomImage", $randomIndex);

Однако иногда я получаю одно и то же целое число дважды подряд.

$ сеанс является частью API-интерфейса ProcessWire, но по существу совпадает с $_SESSION.

Есть какие-нибудь указатели о том, где я ошибаюсь?Я думаю, что вместо «продолжить» нужно снова сбросить цикл?

Ответы [ 3 ]

3 голосов
/ 24 сентября 2019

Вы можете использовать цикл while,

$last = $session->get("randomImage");
$rng = random_int(0, count($page->images) - 1); // < PHP 7? Use rand()

while ($rng === $last) {
    $rng = random_int(0, count($page->images) - 1);    
}

$session->set("randomImage", $rng);

Этот цикл будет пытаться сгенерировать случайное число, пока новое не станет равным старому.Если вы беспокоитесь о том, что застряли в цикле навсегда, вы можете оставить счетчик и выйти из строя после определенного числа итераций.

0 голосов
/ 25 сентября 2019

Трудно понять, почему вы не получаете уникальные целые числа, поскольку код выглядит так, как будто он должен работать, но вот альтернативный подход, который немного проще.

$randomOffset = rand(1,$count-1) ;
$session->set(
    "randomImage" ,
    ($session->get("randomImage") + $randomOffset) % $count
) ;

%, это оператор по модулюТаким образом, мы выполняем арифметику циферблата для «clock» с $ count «hours».Смещение ограничено, чтобы быть меньше, чем полное «вращение», поэтому мы никогда не сможем вернуться к тому же «часу» на «часах», но мы можем перейти к каждому другому часу с равномерно случайным шансом каждого.

Я подозреваю, что ваша проблема может быть где-то еще в вашей кодовой базе, однако.

0 голосов
/ 24 сентября 2019

Попробуйте это:

$count = count($page ->images) - 1   ;
for ($i=0;  $i<$count                ;$i++){

    $randomIndex = rand(0, $count)   ;

    if ($session->get("randomImage")
    &&  $session->get("randomImage")
    ==                $randomIndex)        {
        $i = 0                       ;
        if($i==0){continue           ;     }
    }
}
$session->set("randomImage",
                        $randomIndex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...