Получить случайное число, которое соответствует / не соответствует критериям (PHP) - PullRequest
0 голосов
/ 24 июня 2009

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

IE: я хочу $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;
    }
}

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

Ответы [ 4 ]

4 голосов
/ 24 июня 2009

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

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

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

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

Оба из них имеют предсказуемое время.

3 голосов
/ 24 июня 2009

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

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

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

echo $testData[$rand];
1 голос
/ 24 июня 2009

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

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

0 голосов
/ 24 июня 2009

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

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];     

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...