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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать массив, из неповторяющихся элементов 
:(
    Опции темы
HackMan
Дата 16.12.2007, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



Создать массив, например, из 1000 неповторяющихся чисел в диапазоне от 0 до 9999

Пока ничего умнее следующего придумать не смог
Код

  $array[] = 0;
  $c = 0;

  while ($c < 1000)
    {
      $x = rand(0, 9999);
      
      $fl = true;

      foreach ($array as $key => $value)
        if ($value == $x)
          {
            $fl = false;
            break;
          }

      if ($fl)
        {
          $array[$c] = $x;
          $c++;
        }
    }

  sort($array);
  print_r($array);

Но такой метод по скорости работы оставляет желать лучшего...
Есть ли более рациональные способы?

Это сообщение отредактировал(а) HackMan - 16.12.2007, 03:42


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
SelenIT
Дата 16.12.2007, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Как вариант (по сути - почти то же самое ;):
Код

$array = array();
while(count($array) < 1000) {
   $array[mt_rand(0, 9999)] = 1;
}
$array = array_keys($array);
sort($array);


Как другой вариант- взять range(0, 9999), перемешать (shuffle), отрезать кусок в 1000 штук и отсортировать (раз надо), но это дольше, очевидно (хотя и быстрее, чем вложенный цикл).


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Kallisto
Дата 16.12.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: -3
Всего: -1



Код
<?
$res=array();
for($i=0;$i<1000;$i++)
{
$r=rand(0,9999);
if(!in_array($r, $res)) $res[]=$r;
}
var_dump($res);

PM MAIL   Вверх
Feldmarschall
Дата 16.12.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Kallisto, сам поймёшь свою ошибку?
PM   Вверх
Mal Hack
Дата 17.12.2007, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



PM ICQ   Вверх
HackMan
Дата 17.12.2007, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



Kallisto, спасибо за функцию in_array.
Но всё же это наверняка не самый оптимальный способ.

SelenIT, а почему shuffle будет работать медленнее?

Mal Hack, спасибо, но эта функция заполняет массив с шагом, а не случайным образом

Это сообщение отредактировал(а) HackMan - 17.12.2007, 09:11


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
SelenIT
Дата 17.12.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



Цитата(HackMan @  17.12.2007,  09:06 Найти цитируемый пост)
почему shuffle будет работать медленнее?

Потому, что ей придется перемешивать все 10000 элементов, вместо того, чтобы тысячу с небольшим раз "потыкать" в диапазон в поисках незанятых мест. Это при заданных параметрах. Если понадобится выбрать порядка половины диапазона и более, то вариант с shuffle вполне может оказаться даже быстрее. А для маленьких массивов (сотня-другая элементов) вариант с shuffle + array_slice вообще можно смело использовать всегда - торможение будет совершенно незаметным по сравнению с простотой и надежностью метода.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Feldmarschall
Дата 17.12.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Совершенно верно. in_array - это более оптимальный, но всё равно - вложенный цикл с перебором всего массива.
Не говоря уже о том, что конкретный код Kallisto, не отвечает условиям задачи.

Именно поэтому код SelenIT работает с ключами, а не со значениями.
PM   Вверх
HackMan
Дата 18.12.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



 smile  спаибо.
Вот интересно, каким образом это делает MySQL при запросе
Код
SELECT * FROM `test` ORDER BY RAND() LIMIT 1000



--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
Feldmarschall
Дата 18.12.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



весьма неоптимальным.

Вообще, 1000 реально случайных и уникальных значений представляются мне довольно странной потребностью
PM   Вверх
HackMan
Дата 19.12.2007, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Юзверь-программист
**


Профиль
Группа: Участник
Сообщений: 391
Регистрация: 18.6.2005
Где: .ua

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



Просто был большой список людей, из которых случайным образом надо было выбрать только 500. Интересно было, какой алгоритм будет самым оптимальным.

Это сообщение отредактировал(а) HackMan - 19.12.2007, 03:48


--------------------

Завтра - это самый загруженный день недели smile

user posted image

user posted image
PM MAIL ICQ   Вверх
Feldmarschall
Дата 19.12.2007, 10:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Я понимаю, когда есть большой список, и надо отобрать из него случайным образом 500 человек. 

Один раз.

Я не понимаю, когда есть большой список, и надо отобрать из него случайным образом 500 человек каждую секунду.

В первом случае оптимальность соверщенно не играет никакой роли.

Второй же, как я уже написал - не понимаю, зачем может понадобиться.
PM   Вверх
Mal Hack
Дата 19.12.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Feldmarschall, вы не понимаеете сути... 1000 Записей уже в памяти находятся в рэндомном практичеки порядке... ;)
Либо становятся такими после первого RAND()
Учим матчасть по части того, как хранятся данные в памяти сервера БД....
PM ICQ   Вверх
Feldmarschall
Дата 19.12.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Не всякая база влезает в оперативную память.
PM   Вверх
Mal Hack
Дата 19.12.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



йоперный театр....
Вы хоть отдаете себе отчет, что в 80% БД,  в 99% слчаев, реально постоянно работа ведется с 5-20% данными, которые и находятся в ОП... Остальное подгружается по мере необходимости...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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