Другие языки программирования и технологии
random в С++
Добрый день. Подскажите, как организовать в С++ функцию random, чтобы числа все время были разные... к примеру: тут будут случайные числа от 0 до 50... но как сделать, чтобы эти числа в порядке не повторялись?
Не совсем понятно, что же нужно?
Если есть маасив размером 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 элементов) .
Если есть маасив размером 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 элементов) .
Заполните массив числами от 0 до 50, потом примените функцию random_shuffle из <algorithm>
Речь, конечно же, о целых числах.
Ну или сами опишите, аналогично этому
http://www.cplusplus.com/reference/algorithm/random_shuffle/
Речь, конечно же, о целых числах.
Ну или сами опишите, аналогично этому
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;
}
#include <stdlib.h>
#include <time.h>
int main ()
{
int tmp;
srand ( time(NULL) );
tmp = rand() % 51;
return 0;
}
Похожие вопросы
- Как сделать Random в C#
- Проблема с оператором random в паскале
- Класс Math и его метод random
- Random
- Чем отличаются (randomize; и random;)?
- С++ Random(); Random(); Как задать диапазон значений от -116 до 950?
- народ поделись кодом на асме которым С++ считает функцию random()
- Как работает random?
- Почему не работает Random на Си
- КАК С ГЕНЕРИРОВАТЬ ДВА МАССИВА ИЗ СЛУЧАЙНЫХ ЧИСЕЛ С ПОМОЩЬЮ RANDOM НА ЯЗЫКЕ СИ? Я смог только заполнить от 0 до 255