Получить случайное число, которое соответствует/не соответствует критериям (PHP)

StackOverflow https://stackoverflow.com/questions/1039400

  •  22-07-2019
  •  | 
  •  

Вопрос

Используя PHP (другие языки, использование общих встроенных модулей приветствуются), как я могу получить случайное (или псевдослучайное) число, которое НЕ соответствует определенным критериям?

ИЕ:Я хочу $x = rand(0, 99) но только если ($x % 9) != 0.

Каков приемлемый способ ограничить случайные числа такими критериями?

В качестве примера, используя while() цикл и, возможно, breakкогда у нас есть что-то, что соответствует нашим критериям, а затем использовать случайное число после цикла?:

while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) ) 
{ 
    // Do nothing?
}

Или что-то вроде:

while ( $rand_key = array_rand($array_of_items) ) 
{ 
    if ( $rand_key % 9 == 0 ) {
        break;
    }
}

Или есть более краткий или подходящий способ сделать это?

Это было полезно?

Решение

Один из редких случаев, когда цикл do-while действительно помогает

$testData = array( 7, 8, 9 );

do {
  $rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );

echo $testData[$rand];

Другие советы

Это ваш точный случай использования или просто пример?

Если вы пытаетесь (в частности) получить числа от 0 до 99, исключая точные числа, кратные 9, я могу придумать несколько способов избежать неловкого зацикливания. Люди не любят зацикливаться при генерации случайных чисел, потому что вы можете зацикливаться вечно. (Но, конечно, этого не произойдет, если вы не очень неудачливый тип - тот человек, который оказывается в перестрелке с Клинтом Иствудом в спагетти-вестернах.)

<Ол>
  • Вы можете иметь справочную таблицу, которая переназначает случайные числа, которые вы получаете в те, которые вы хотите.

  • Создайте 0-88 случайным образом. Умножьте результат на 9 и разделить его на 8 и получить целочисленный результат (пол, а не круг). Затем добавьте 1.

  • У обоих из них есть предсказуемые сроки.

    Альтернативный метод, который обменивает пространство для, возможно, нескольких вызовов PRNG, для случаев с небольшим количеством допустимых результатов (как в вашем примере), состоит в заполнении массива допустимыми решениями и использовании PRNG для создания индекса в массив.

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

    Это соответствует требованию «краткости»:

    while( ($x = rand(0, 99)) % 9 == 0 );
    echo $x;
    

    или

    while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 ); 
    echo $array_of_items[$rand_key];     
    

    Однако это не очень читабельно.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top