Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > как реализовать случайный выбор в скрипте


Автор: A67809R 25.1.2013, 22:16
здравствуйте. Как можна реализовать например в скрипте.... Что бы например, 1000 человек приходящих ко мне на сайт, не попадали бы все, а перенаправлялись бы заданое количество посетителей, на другой. Подскажите плизсс 

Автор: skyboy 25.1.2013, 22:58
http://php.net/rand

Автор: Vardoulacha 26.1.2013, 04:43
Лучше все таки http://php.net/manual/ru/function.mt-rand.php он как минимум быстрее.

А вообще задача какая-то туманная, и мне например показалось что заранее известно кличесто людей которое нужно перенаправить из 1000, тогда вот решение http://php.net/manual/ru/function.array-rand.php или можно вообще взять массив и сделать ему http://php.net/manual/ru/function.shuffle.php а потом взять первые значения нужное количество.

Автор: MaXL 29.1.2013, 04:14
Цитата

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

Почему туманная. Вполне http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%BE%D0%B0%D0%BA%D0%B8%D0%BD%D0%B3, правда примитивное и наивное решение smile

Цитата

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

чо  smile 

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

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


Автор: Vardoulacha 29.1.2013, 08:12
Gold Dragon, вот http://stackoverflow.com/questions/2753268/php-difference-between-shuffle-and-array-rand написано что разница очень мала даже на больших массивах

Автор: Gold Dragon 29.1.2013, 18:03
не всё так просто.. или я не так проверяю или очень даже разные результаты smile

вот тест
Код

$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

Автор: MaXL 25.2.2013, 14:47
Это тест чего smile ?
Какое вы имеете право сравнивать эти две функции ?

Автор: Arantir 25.2.2013, 19:40
Цитата(Gold Dragon @  29.1.2013,  17:03 Найти цитируемый пост)
не всё так просто.. или я не так проверяю или очень даже разные результаты smile

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

Цитата(MaXL @  25.2.2013,  13:47 Найти цитируемый пост)
Это тест чего smile ?
Какое вы имеете право сравнивать эти две функции ? 
Тут сравнивают не функции, а результат. array_rand при количестве выбираемых элементов, равном объему массива, фактически делает то же самое, что shuffle

Добавлено через 10 минут и 16 секунд
Код

$n = 1000;
$array = array();
for($i=0; $i<$n; $i++){
    $array['qwerty'.$i] = 'qwerty'.$i;
}
echo "n = $n<br>";
$sysstart = microtime(true);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);
$a = shuffle($array);
echo round((microtime(true) - $sysstart), 5) . "<br>";
$sysstart = microtime(true);
$a = array_rand($array,$n);
$a = array_rand($array,$n);
$a = array_rand($array,$n);
$a = array_rand($array,$n);
$a = array_rand($array,$n);
echo round((microtime(true) - $sysstart), 5) . "<br>";
echo '-------------<br>';

n = 10
1.0E-5
1.0E-5
-------------
n = 100
2.0E-5
7.0E-5
-------------
n = 1000
0.00024
0.0008
-------------
n = 10000
0.00263
0.01136
-------------
n = 100000
0.17183
0.15554
-------------
n = 1000000
2.03217
1.75671
-------------

Зависимость нелинейная. Но при малых N быстрее shuffle, а при больших - array_rand.

Автор: MaXL 26.2.2013, 11:29
Цитата

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

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

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

Естественно, что операция перестройки массива сложнее.

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

Цитата(MaXL @  25.2.2013,  15:47 Найти цитируемый пост)
Какое вы имеете право сравнивать эти две функции ? 
Это вообще что за бред. MaXL, у тебя право собственности на эти функции что ли smile Такое ощущение, что ты не в теме беседы и пишешь какие-то случайные фразы

Автор: Arantir 27.2.2013, 20:40
Цитата(MaXL @  26.2.2013,  10:29 Найти цитируемый пост)
А вы видели исходное сообщение, к которому написан мой комментарий ?
Там ваше пресловатую $n, для функции array_rand равно еденицы.

Невероятно, но именно это я написал чуть выше процитированной вами части моего сообщения. =)
 
Цитата(MaXL @  26.2.2013,  10:29 Найти цитируемый пост)
Естественно, что операция перестройки массива сложнее. 

Может и сложнее... Но для всех N, с разумными и практично применимыми значениями, эта операция быстрее. Не могу представить адекватного использования массивов, объемом более полмиллиона элементов, в PHP.

Автор: MaXL 17.4.2013, 06:57
Цитата

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

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

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

$a = shuffle($array);

$array будет перемешан, а в $a будет http://www.php.net/manual/ru/function.shuffle.php true.

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

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

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

Абсолютно разные функции, и разное поведение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)