Другие языки программирования и технологии

random в С++

Добрый день. Подскажите, как организовать в С++ функцию random, чтобы числа все время были разные... к примеру: тут будут случайные числа от 0 до 50... но как сделать, чтобы эти числа в порядке не повторялись?
Юрий Крудалов
Юрий Крудалов
2 203
Не совсем понятно, что же нужно?
Если есть маасив размером 50, и его нужно заполнить числами от 0 до 50, то просто заполните массив, а потом перемешайте его.

#include <time.h>

int main()
{
// Заполняем
int A[50];
for (int k = 0; k < 50; ++k)
{
A[k] = k;
}

// Мешаем
srand((int)time(NULL));
for (int k = 0; k < 50; ++k)
{
int n = (50 * rand()) / (RAND_MAX + 1);
int t = A[k];
A[k] = A[n];
A[k] = t;
}

return 0;
}

Если размер массива меньше 50, и его нужно заполнить уникальными значениями от 0 до 50, то придется немного потрудиться.
Генерировать случайные значения от 0 до 50, и проверять предыдушие значения.

#include <time.h>

int main()
{
srand((int)time(NULL));

// Заполняем
int A[20];
for (int k = 0; k < 20; ++k)
{
int n;
do
{
// Случайное число от 0 до 50
n = (50 * rand()) / (RAND_MAX + 1);

// Проверяем предыдущие
for (int j = 0; j < k; ++j)
{
if (A[j] == n)
{
n = -1;
break;
}
}
} while (n < 0);

A[k] = n;
}

return 0;
}

Но если разница размера массива и диапазона значенией будет небольшой (например 48 и 50), то алгоритм будет сильно тормозить на последних иттерациях цикла. Потому что вероятность выпаданий подходящего значения будет маленькой.
В этом случае можно заполнить массив как в первом примере, и взять из него только часть (первые 48 элементов) .
ГА
Геннадий Алеев
21 360
Лучший ответ
Заполните массив числами от 0 до 50, потом примените функцию random_shuffle из <algorithm>
Речь, конечно же, о целых числах.

Ну или сами опишите, аналогично этому
http://www.cplusplus.com/reference/algorithm/random_shuffle/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
int tmp;
srand ( time(NULL) );
tmp = rand() % 51;
return 0;
}