как реализовать случайный выбор в скрипте

 
0
 
PHP
ava
A67809R | 25.01.2013, 23:16
здравствуйте. Как можна реализовать например в скрипте.... Что бы например, 1000 человек приходящих ко мне на сайт, не попадали бы все, а перенаправлялись бы заданое количество посетителей, на другой. Подскажите плизсс 
Kommentare (12)
ava
skyboy | 25.01.2013, 22:58 #
ava
Vardoulacha | 26.01.2013, 04:43 #
Лучше все таки mt_rand() он как минимум быстрее.

А вообще задача какая-то туманная, и мне например показалось что заранее известно кличесто людей которое нужно перенаправить из 1000, тогда вот решение array_rand() или можно вообще взять массив и сделать ему shuffle() а потом взять первые значения нужное количество.
ava
MaXL | 29.01.2013, 04:14 #
Цитата


А вообще задача какая-то туманная


Почему туманная. Вполне конкретная задача, правда примитивное и наивное решение :)

Цитата


вот решение array_rand() или можно вообще взять массив и сделать ему shuffle() а потом взять первые значения нужное количество.


чо  smile 
ava
Gold Dragon | 29.01.2013, 06:41 #
Цитата (A67809R @  25.1.2013,  23:16 findReferencedText)
Что бы например, 1000 человек приходящих ко мне на сайт, не попадали бы все, а перенаправлялись бы заданое количество посетителей, на другой. 
роботы забанят быстро

а что быстрее array_rand() или  shuffle()? кто проверял?

ava
Vardoulacha | 29.01.2013, 08:12 #
Gold Dragon, вот тут написано что разница очень мала даже на больших массивах
ava
Gold Dragon | 29.01.2013, 18:03 #
не всё так просто.. или я не так проверяю или очень даже разные результаты :)

вот тест

$array = array();
for($i=0; $i<100000; $i++){
    $array['qwerty'.$i] = 'qwerty'.$i;
}

$sysstart = microtime(true);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);

echo round((microtime(true) - $sysstart), 5) . '<hr>';

$sysstart = microtime(true);
$a = array_rand($array,1);
$a = array_rand($array,1);
$a = array_rand($array,1);
$a = array_rand($array,1);
$a = array_rand($array,1);
echo round((microtime(true) - $sysstart), 5);


при 10000
shuffle - 0.00394
array_rand - 0.0008

при 100000
shuffle - 0.21016
array_rand - 0.0205

при 1000000
shuffle - 2.71401
array_rand - 0.02954
ava
MaXL | 25.02.2013, 14:47 #
Это тест чего smile ?
Какое вы имеете право сравнивать эти две функции ?
ava
Арантир | 25.02.2013, 19:40 #
Цитата (Gold Dragon @  29.1.2013,  17:03 findReferencedText)
не всё так просто.. или я не так проверяю или очень даже разные результаты smile



вот тест
Ну дело в том, что в shuffle всегда участвует весь массив, а в array_rand вы в своем тесте выбираете только один элемент. Выбрать 1 из 1000000 уж побыстрее, чем перемешать этот 1000000.

Цитата (MaXL @  25.2.2013,  13:47 findReferencedText)
Это тест чего smile ?

Какое вы имеете право сравнивать эти две функции ? 
Тут сравнивают не функции, а результат. array_rand при количестве выбираемых элементов, равном объему массива, фактически делает то же самое, что shuffle
ava
MaXL | 26.02.2013, 11:29 #
Цитата


Тут сравнивают не функции, а результат. array_rand при количестве выбираемых элементов, равном объему массива, фактически делает то же самое, что shuffle


А вы видели исходное сообщение, к которому написан мой комментарий ?
Там ваше пресловатую $n, для функции array_rand равно еденицы.

Основное отличие в том, что shuffle делает перестановку массива, а array_rand возвращает массив случайных чисел из заданного диапазона (ключи массива).

Естественно, что операция перестройки массива сложнее.
ava
Gold Dragon | 27.02.2013, 18:54 #
Цитата (MaXL @  26.2.2013,  12:29 findReferencedText)
Естественно, что операция перестройки массива сложнее. 
Кто сказал??? Я чтобы подобное утверждать провёл тесты. А что сделал ты?

Цитата (MaXL @  25.2.2013,  15:47 findReferencedText)
Какое вы имеете право сравнивать эти две функции ? 
Это вообще что за бред. MaXL, у тебя право собственности на эти функции что ли smile Такое ощущение, что ты не в теме беседы и пишешь какие-то случайные фразы
ava
Арантир | 27.02.2013, 20:40 #
Цитата (MaXL @  26.2.2013,  10:29 findReferencedText)
А вы видели исходное сообщение, к которому написан мой комментарий ?

Там ваше пресловатую $n, для функции array_rand равно еденицы.

Невероятно, но именно это я написал чуть выше процитированной вами части моего сообщения. =)

Цитата (MaXL @  26.2.2013,  10:29 findReferencedText)
Естественно, что операция перестройки массива сложнее. 

Может и сложнее... Но для всех N, с разумными и практично применимыми значениями, эта операция быстрее. Не могу представить адекватного использования массивов, объемом более полмиллиона элементов, в PHP.
ava
MaXL | 17.04.2013, 06:57 #
Цитата


Это вообще что за бред. MaXL, у тебя право собственности на эти функции что ли smile Такое ощущение, что ты не в теме беседы и пишешь какие-то случайные фразы 


 smile  потому что это две разные функции. Объясняю =)

После этой строчки

$a = shuffle($array);

$array будет перемешан, а в $a будет скорее всего true.

А вот в случае с:

$a = array_rand($array,$n);

в $a  будет массив перемешанных ключей, а массив $array останеться прежнем. В ваших тестах, как минимум на этоп этапе происходит выделение памяти под новый массив.

Абсолютно разные функции, и разное поведение.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden