Top.Mail.Ru
Ответы

Генерация уникальных чисел от 1 до 100 на С++

Добрый день.
Интересен такой вопрос. Надо заполнить матрицу 10х10, УНИКАЛЬНЫМИ случайными числами от 1 до 100. Вроде все это банально. И реализовал я с помощью двух массивов. Один двумерный - заполняем уникальными числами (это наш конечный массив) и второй одномерны (буфер) - куда мы записываем те же уникальные значения с целью проверки очередного сгенерированного значения с уже записанными. использую функцию rand()%100. Вся проблема заключается в том, что уже на 9 строке матрицы 10х10 программа гоняет цикл по 10 минут из-за того что не может сгенерировать случайно число, которое не генерировала до этого. Все это из-за того что все же это псевдослучайные числа. Так вот как решить эту проблему, как быстро сгенерировать все 100 уникальных чисел?

По дате
По рейтингу
Аватар пользователя
Новичок
8лет

Записать числа от 1 до 100 в одномерный массив по порядку.
Потом генерировать случайное число i от 0 до 99 (это будет номер элемента). И поменять местами нулевой елемент с i-тым елементом. Тоже самое для первого, второго и так до 99-го. Потом этот одномерный массив разложить по строкам.
А можно такой обмен делать сразу в матрице от 1 до 100. Только для обмена придется генерировать 2 индекса в диапазоне от 0 до 9

Аватар пользователя
Гений
8лет

Заполняете массив последовательными числами от 1 до 100 и тасуете их, например, по алгоритму Фишера-Йетса:
https://ru.wikipedia org/wiki/Тасование_Фишера_—_Йетса
(заменить пробел на . )
Для простоты можно использовать и только один массив, переопределив для заполнения и тасования тот же массив, если он статический, как одномерный.

Аватар пользователя
Мастер
8лет

std::shuffle

Аватар пользователя
Просветленный
8лет

Один из вариантов:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int n = 10;
bool exists(int a[n * n], int v){
 if (a[v]){
  a[v] = 0;
  return false;
 } else
  return true;
}
int main(){
 srand(time(NULL));
 int a[n][n], b[n * n], v;
 for (int i = 0; i < n * n; b[i] = i + 1, ++i);
 for (int i = 0; i < n; cout << endl, ++i)
  for (int j = 0; j < n; a[i][j] = v + 1, printf("%4d", a[i][j]), ++j)
   for (v = rand() % 100; exists(b, v); v = rand() % 100);
 cin.get();
 return 0;
}

Аватар пользователя
8лет

А если записать все числа в массив по порядку.
Вытаскивать их от туда через случайный индекс от 0 до длины массива.
После того, как число будет взято, удалять это число из массива и укорачивать массив на единицу.