Подскажите Уникально-рандомный цикл

Тема в разделе "PHP", создана пользователем poikl, 11 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. poikl

    poikl

    Регистр.:
    7 ноя 2006
    Сообщения:
    164
    Симпатии:
    31
    Нужно "рандомное" взятия числе из списка.
    То есть у меня есть промежуток от 1-1000

    for ($k=1;$k<1000;$k++) {
    ...
    }
    то получается все по порядку
    а надо чтобы работала так
    есть промежуток 1-1000
    скрипт берет рандомно число из этого промежутка отрабатывает и берет другое рандомное число из этого промежутка , но делает это 1000 раз и числа не повторяюца тоесть в итоге скрипт пройдеца по всему промежутку от 1-1000 и не разу не повторица.


    Как варант сделать фаил с цыфрами и брать отуда рандомно строку и обрезать ее но мне кажеца есть проще способ вот только я его незнаю , помогите с этой задачкой.
     
  2. WorkNets

    WorkNets

    Регистр.:
    25 апр 2008
    Сообщения:
    161
    Симпатии:
    37
    Я так понял что рандомное число нужно внутри цикла?
    Как вариант рандомь его внутри цикла и используй...

    Код:
    for ($k=1;$k<1000;$k++) 
       {
         ...
         $t= mt_rand(1, 1000); // в t и будет нужное число...
         echo ("$t <br>");
         ...
       }
    Как то так .....
     
  3. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Давно еще на одном форуме по сео был отличный предложен вариант. Достоин занесения в приемы программирования.

    Суть проста - удалите дубликаты, перемешайте и выбирайте по одному. Так будут исключены повторения выборки.

    на пхп это делается просто

    PHP:
    $data=array(); //исходный массив
    $mixed=array_unique(data); //уникальный
    shuffle($mixed); //перемешанный
    $mixed и выбирайте в простом цикле по одному.
     
    Alix нравится это.
  4. Alix

    Alix

    Регистр.:
    27 янв 2008
    Сообщения:
    234
    Симпатии:
    84
    Liver, хорошее решение, спасибо.
    Только мне кажется, что можно пропустить шаг генерации рандомного массива и удаления уникальных. Ведь в таком случае не будет 100% гарантии, что в исходном массиве $data содержатся все числа в пределах от 1 до 1000. Т.е. если делать это циклом в 1000 шагов, при каждом шаге добавляя в массив уникальное число - велика вероятность добавления одинаковых чисел, которые потом удалятся.
    По-моему можно просто запихнуть в исходный массив $data все числа от 1 до 1000, затем перемешать и дергать по одному.
     
  5. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Alix

    Я не генерирую рэндомный массив. Я чищу и перемешиваю исходный. А откуда он берется и что в нем - личное дело каждого. Конечно, можно не чистить дубликаты. А гарантия 100% наличия всех нужных чисел в массиве выходит за рамки выборки без повторений. Если в исходном массиве они все есть, то никакое удаление дублей их не уничтожит.

    Проще сказать я предложил алгоритм, но не решение конкретной задачи.

    А применимо к задаче лучше решение будет такое.
    PHP:
    $list=file('list.txt'); //вот и массив
    $keys=array_keys($list); //вот вам и ключи и так лучше. вдруг будет ассоциативный массив на входе

    //$mixedKeys=array_unique($keys); //уникальный не нужен
    shuffle($keys); //перемешанный  

    foreach($keys as $key){
    ....
    $list[$key];///вот и выборка
    }

    В этом примере даже генерировать не нужно от 1 до 1000
     
    poikl нравится это.
Статус темы:
Закрыта.