R0 CREW

RAND

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

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

ЗЫ: Ты в таких постах лучше сразу указывай все что знаешь, а то так не интересно.

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

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

#include <algorithm>

int mas[100] = {1, 2, 3, ... , 100};

random_shuffle(&mas[0], &mas[100]);

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

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

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;
    }
}

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

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

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ти уже можно зае***ся :slight_smile:

CoCreateGuid не ?