function — генерирует в PHP массив случайных чисел, не близких к предыдущему элементу X

Я хочу сгенерировать в PHP массив случайных чисел, но каждое число не должно совпадать с любым из чисел X (например, 2) до него и даже близко к любому из них по определенному диапазону (например, 5) ,

Так, например:

  • Мне нужны цифры от 1 до 100
  • я установил свой «диапазон» на 5
  • первые два сгенерированных числа 20 и 50.
  • третье число будет случайным числом от 1 до 100, исключая все числа от 15 до 25 и от 45 до 55.

Я не могу понять функцию для ее достижения. В идеале я хочу назвать что-то вроде этого:

getRandomNumbers ($ min, $ max, $ previous, $ range);

где $ предыдущая количество предыдущих элементов, которые необходимо учитывать при создании следующего и $ диапазон это «близость» к тому числу, где я не хочу, чтобы следующий номер был.

Надеюсь, я достойно объяснил мою просьбу. 🙂 Пожалуйста, добавьте комментарий, если у вас есть какие-либо вопросы по этому поводу.

0

Решение

Я только что придумал это:

function getRandomNumbers($min, $max, $previous, $range) {
static $generated = array();
$chunk = array_slice($generated, -$previous);

// Added this infinite loop check to save you some headache.
if (((($max - $min + 1) / (($range * 2) + 1)) + 1) <= $previous) {
die("Values set have the potential of running into an infinite loop. Min: $min, Max: $max, Previous: $previous, Range: $range");
}

while(true) {
$number = rand($min, $max);
$found = true;
foreach ($chunk as $value) {
if (in_array($number, range($value-$range, $value+$range))) {
$found = false;
}
}
if ($found) {
$generated[] = $number;
return $number;
}
}
}

Проверьте это с помощью этого:

for ($i = 1; $i < 25; $i++) {
echo getRandomNumbers(1, 100, 5, 5) . "<br />";
}

PHPFiddle Link: http://phpfiddle.org/main/code/51ke-4qzs

Изменить: Добавлена ​​проверка, чтобы предотвратить возможный бесконечный цикл. Например: если вы установите следующие значения:

$min = 1;
$max = 100;
$previous = 5;
$range = 12;
echo getRandomNumbers($min, $max, $previous, $range);

Тогда, скажем, в действительно неудачной ситуации это сгенерирует 13, 38, 63 и 88. Таким образом, 5-е число не может быть ничем между 1 и 25, 26 и 50, 51 и 75, 76 и 100. Таким образом, это приведет к бесконечный цикл. Я также обновил ссылку PHPFiddle.

1

Другие решения

getRandomNumbers( $previous, $range ) {
//I'm assuming that previous will be an array of your previous X that you don't want to be close to
$num = getRandomNumber() //However you are doing this now
foreach( $previous as $key => $value ) {
if ( ( $value - $range ) > $num && ( $value + $range ) < $num ) {
return getRandomNumbers($previous, $range);
}
}
//You need to also replace a value in previous
return num;
}
0

По вопросам рекламы [email protected]