Генератор случайных чисел - с ислючениями

Alexander

Новичок
Генератор случайных чисел - с ислючениями

У меня такая задача, надо чтобы генерировалось случайное число из заранее известного диапозона, но с исключениями. Например чтобы генерировалось число от 0 до 15, но не подходят например 3,7 и 8. Мне ничего лучше не пришло в голову чем поставить условие что если сгенерированное число совпадает с исключениями, то пусть генерируется заново, и заново проверяется. Но это очень загружает систему, когда исключений становитъся много и приходиться много раз снова генерировать число и проверять его. Это выглядит примерно так:
Код:
$a = file("data/povtory.txt"); // на каждой строчке файла по одному числу, которое не подходит

$rnd = rand(0,15);

for($i=0; $i<(count($a)-1); $i++){   // Если число есть в массиве $a, то генерируй новое и цикл идет по новой 
	if (trim($a[$i]) == $rnd){
		$rnd = rand(0,15);
		$i=0;
	    };
    };
Наверняка эту задачу можно решить куда эффективней, но только как?
Мне что-о ничего не приходит в голову :cry: , подскажите пожалуйсто.
 

kruglov

Новичок
забиваем массив разрешенными числами и берем элемент со случайным номером.
 

avenger_msoft

Новичок
Можно так:
PHP:
$rnd = rand(0,15);
while (in_array($rnd, $a)) $rnd = rand(0,15);
А лучше так:
PHP:
do 
	$rnd = rand(0,15);
while (in_array($rnd, $a));
 

bgm

&nbsp;
Можно хранить разрешённые интервалы в массиве и выбирать сначала случайный интервал, а потом генерировать число из этого интервала.
 

SelenIT

IT-лунатик :)
bgm
Так труднее обеспечить равномерность распределения (по-моему).

PHP:
// тут был действительно бредовый код, приношу извинения
 

Wicked

Новичок
еще вариант.

находим разницу 15 - count(array(3, 7, 8)). Получаем 12. Находим случайное число $ind <= 12, которое означает порядковый номер среди валидных ячеек. Например, $ind = 6. Далее бежим по массиву исключений, перепрыгивая $ind'ом эти самые исключения:

PHP:
<?

$excl = array(3, 7, 8);

function find_place($ind, $excl) {
  foreach ($excl as $val) {
    if ($val <= $ind) {
      $ind++;
    } else {
      return $ind;
    }
  }
  return $ind;
}

print find_place(6, $excl); // 9, как и ожидалось
print find_place(5, $excl); // 6, как и ожидалось
?>
 

[SDem]

Новичок
>kruglov
забиваем массив разрешенными числами и берем элемент со случайным номером.

ИМХО - на данный момент это самый простой и быстрый способ из предложенных.Во всяком случае если диапазоны не очень большие.
 

Wicked

Новичок
[SDem]
"самый простой" для понимания - может быть.
"самый простой" по реализации - не факт.
"самый быстрый" - zzzzzzz...
 

Alexander

Новичок
Всем огромное спасибо. Саму идею понял, и риализовал(чуть по другому, так как задача чуть сложнее). всем огромное спасибо=)
P.S. Странно что в PHP нет функций типа "удали строку из фаила/массива"
P.S:Правда спасибо=)
 

Wicked

Новичок
из файла - нужно перезаписать весь файл за исключением этой строки

из массива - unset($arr[$key])
 
Сверху