Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как реализовать случайный выбор в скрипте 
:(
    Опции темы
A67809R
Дата 25.1.2013, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.1.2013

Репутация: нет
Всего: нет



здравствуйте. Как можна реализовать например в скрипте.... Что бы например, 1000 человек приходящих ко мне на сайт, не попадали бы все, а перенаправлялись бы заданое количество посетителей, на другой. Подскажите плизсс 
PM MAIL   Вверх
skyboy
Дата 25.1.2013, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



PM MAIL   Вверх
Vardoulacha
Дата 26.1.2013, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 7
Всего: 8



Лучше все таки mt_rand() он как минимум быстрее.

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

Это сообщение отредактировал(а) Vardoulacha - 26.1.2013, 04:47
PM MAIL   Вверх
MaXL
Дата 29.1.2013, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата

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

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

Цитата

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

чо  smile 


--------------------
MaXL
PM MAIL   Вверх
Gold Dragon
Дата 29.1.2013, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



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

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




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Vardoulacha
Дата 29.1.2013, 08:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 11.8.2005

Репутация: 7
Всего: 8



Gold Dragon, вот тут написано что разница очень мала даже на больших массивах
PM MAIL   Вверх
Gold Dragon
Дата 29.1.2013, 18:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



не всё так просто.. или я не так проверяю или очень даже разные результаты 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

Это сообщение отредактировал(а) Gold Dragon - 29.1.2013, 18:04


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MaXL
Дата 25.2.2013, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Это тест чего smile ?
Какое вы имеете право сравнивать эти две функции ?


--------------------
MaXL
PM MAIL   Вверх
Arantir
Дата 25.2.2013, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(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.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
MaXL
Дата 26.2.2013, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата

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

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

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

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


--------------------
MaXL
PM MAIL   Вверх
Gold Dragon
Дата 27.2.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



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

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


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Arantir
Дата 27.2.2013, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



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

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

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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
MaXL
Дата 17.4.2013, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 24.10.2005
Где: Владивосток

Репутация: нет
Всего: 2



Цитата

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

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

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

$a = shuffle($array);

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

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

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

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

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


--------------------
MaXL
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1159 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.