Я хочу сгенерировать в PHP массив случайных чисел, но каждое число не должно совпадать с любым из чисел X (например, 2) до него и даже близко к любому из них по определенному диапазону (например, 5) ,
Так, например:
Я не могу понять функцию для ее достижения. В идеале я хочу назвать что-то вроде этого:
getRandomNumbers ($ min, $ max, $ previous, $ range);
где $ предыдущая количество предыдущих элементов, которые необходимо учитывать при создании следующего и $ диапазон это «близость» к тому числу, где я не хочу, чтобы следующий номер был.
Надеюсь, я достойно объяснил мою просьбу. 🙂 Пожалуйста, добавьте комментарий, если у вас есть какие-либо вопросы по этому поводу.
Я только что придумал это:
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.
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;
}