3 случайный значение из заданного диапазона

john.brown

просто кулибин
Ну и мои 5 копеек :)
PHP:
$min = 1; $max = 3; $count = 3;
$vals = array();
for($i = 0; $i < $count; $i++) {
	do{
		$val = rand($min, $max);
	}while(in_array($val, $vals));
	$vals[] = $val;
}
var_dump($vals);
И результаты тестов 10 000 вызовов.

При $max = 3
Код:
Wicked: 2.186
john.brown: 3.931
vovanium: 4.293
vovanium 2: 4.563
Royal Flash: 7.283
При $max = 100
Код:
vovanium 2: 1.166
Royal Flash: 1.683
john.brown: 2.235
Wicked: 2.271
vovanium: 2.448
 

vovanium

Новичок
Ну мой первый вариант легко можно проапгрейдить, если не ставить задачу его однострочным делать, там нужно из while в do while переделать, плюс убрать count из условия.
а in_array медленнее проверки по ключу.
Вот мега алгоритм
PHP:
$i = $count * 4;
$l = 0;
$number = array();
do{
	$z = rand ($min, $max);
	if(empty($number[$z])) {
		$number[$z] = 1;
		$l++;
	}
	elseif(empty($number[$z+1]) && ($z+1) <= $max){
		$number[$z+1] = 1;
		$l++;
	}
	elseif(empty($number[$z-1]) && ($z-1) >= $min){
		$number[$z-1] = 1;
		$l++;
	}
} while($i-- > 0 && $l < $count);
дополнительные условия позволяет поставить числа рядом, в случае совпадения, что ускоряет выборку при небольшом диапазоне
 

john.brown

просто кулибин
vovanium
Да, проверка по ключу разительно быстрее in_array(). Надо будет иметь ввиду :)
А твой 3 вариант быстр при млом диапазоне, а при большом все же 2 вариант безспорный лидер :)
 

vovanium

Новичок
а при большом все же 2 вариант безспорный лидер
Ну так понятное дело что быстрее, так как в таком случае цикл выполняется один раз, и условие проверяется только один раз, а вот как только диапазон не очень большой, он сразу начинает тупить, так как при любом совпадении, он генерит 3 новых случайных числа. Ну и конечно нет универсальности, если нужно будет увеличить количество выбираемых данных, то условие будет веселое.
 

fixxxer

К.О.
Партнер клуба
о нет, только не опять! откопайте старую тему, там все варианты по стопицот раз были :)

ps. когда я вижу код, оформленный в gnu coding style, мне хочется убить всех человеков. Доктор, ето ок?
 

bakla

Новичок
Автор оригинала: zerkms
bakla

простое решение указанной задачи умещается в 4 строки, а у вас портянки на полстраницы.
Ох ты! Неужто ты теор.Ферма в 4 строки можешь доказать? Ну ты геееений!

-~{}~ 19.03.09 13:09:

Ты не "однострочник" случаем?
 

x-yuri

Новичок
zerkms, так приведи свой простой вариант или какой вариант ты считаешь подходящим в данном случае

bakla а ты часом не оптимизатор? ну так, не в обиду ;-)
 

zerkms

TDD infected
Команда форума
x-yuri
мой вариант - перегенерация в случае повтора. все здравомыслящие посетители вполне могут и сами представить реализацию.
 

bakla

Новичок
Вообще считаю, что здравомыслящие человеки такие "задачи" не ставят перед публикой, но все-же иногда хочется извратится. Задачу то можно и без циклов решить.
 

pilot911

Новичок
такое сравнение получается на 300% быстрее, чем in_array :)

$list = '1,2,3,4';
$item = 4;

PHP:
strpos(','.$list.',', ','.$item.',')
 
Сверху