+ Reply to Thread
Results 1 to 10 of 10

Thread: RAND

  1. #1
    500mhz's Avatar

    Default RAND

    Вопрос, существует ли способ получить рандомные значения , к примеру в диапазоне 1-100, с гарантией не повторения? Естественно можно сверять с предыдущими получеными. Может я про rand не все знаю? )))

  2. #2
    Darwin's Avatar

    Default Re: RAND

    1. Создать массив из 100 элементов.
    2. Перемешать.
    3. Выбрать последовательно необходимое кол-во элементов без повторений, например, 10.
    4. Повторить шаги 2-3 нужное кол-во раз.

    ЗЫ: Ты в таких постах лучше сразу указывай все что знаешь, а то так не интересно.
    Last edited by Darwin; 12-02-2014 at 11:37.

  3. #3
    500mhz's Avatar

    Default Re: RAND

    Есть массив 100 элементов, числа от 1 до 100 , идут по порядку, то есть 1,2,3,4,5 итд. Хочу его перемешать что бы числа шли не по порядку ).

  4. #4
    Darwin's Avatar

    Default Re: RAND

    Самый простой вариант.

    Code:
    #include <algorithm>
    
    int mas[100] = {1, 2, 3, ... , 100};
    
    random_shuffle(&mas[0], &mas[100]);

  5. Пользователь сказал cпасибо:
    Dark Koder (12-02-2014)
  6. #5
    500mhz's Avatar

    Default Re: RAND

    Это не стандартное С решение )))

  7. #6
    Darwin's Avatar

    Default Re: RAND

    Вот мое решение для целочисленного массива:

    Code:
    void shuffle(int *mas, size_t size)
    {
        int old_value = 0;
        size_t r_index = 0;
        
        for(size_t index = 0; index < size; index++)
        { 
            r_index = (rand() % (size - 1)) + 1;
            
            if (r_index == index) {
                r_index++;
            }
            
            old_value = mas[r_index];
            mas[r_index] = mas[index];
            mas[index] = old_value;
        }
    }

  8. #7
    JKornev's Avatar

    Default Re: RAND

    Использование массива в данной задаче полезно когда диапозон маленький 100-1000 элементов, если же диапозон большой, то разумнее использовать упорядоенное сбалансированное бинарное дерево, тогда размер дополнительной информации будет соответствовать размеру массива в котором хранились бы уже используемые ключи, + операция проверки существования элемента была бы тоже достаточно быстрой, конечно не O(1) как с массивом, но тем не менее

  9. #8

    Default Re: RAND

    Если чисел нужно немного, то вполне можно ограничиться китайским подходом:

    Code:
    int
    rand100()
    {
        return rand() % 100;
    }
    
    int a, b, c, d;
    a = rand100();
    do { b = rand100(); } while( b == a );
    do { c = rand100(); } while( c == a || c == b );
    do { d = rand100(); } while( d == a || d == b || d == c );

  10. #9
    1nf3c7ed's Avatar

    Default Re: RAND

    Quote Originally Posted by Vtulhu View Post
    Если чисел нужно немного, то вполне можно ограничиться китайским подходом:

    Code:
    int
    rand100()
    {
        return rand() % 100;
    }
    
    int a, b, c, d;
    a = rand100();
    do { b = rand100(); } while( b == a );
    do { c = rand100(); } while( c == a || c == b );
    do { d = rand100(); } while( d == a || d == b || d == c );
    так на 20ти уже можно зае***ся :)

  11. 2 пользователя(ей) сказали cпасибо:
    ARCHANGEL (10-10-2014) Dark Koder (10-10-2014)
  12. #10
    Izg0y's Avatar

    Default Re: RAND

    CoCreateGuid не ?
    ,--= Реальность - это костыль для тех, кто не имеет воображения =--,

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:30
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org