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

C++ Двухмерный массив с случайными не повторяющимися числами.

Создал массив, в который записываются случайные 25 чисел от 30 до 60. Чтобы избежать повторений добавил ещё одну функцию, где каждое новое число будет проверяться на наличие совпадений с теми, что уже есть в массиве путём перебора. Программа записывает числа в массив, но повторения всё равно встречаются. В чём дело?

#include
#include
#include
#include
using namespace std;

int c;
int numerals[5][5];
int x, y, a, o;
int check();
bool f = true;

int main()
{
srand(time(NULL));
for (x = 0; x < 5; x++)
{
for (y = 0; y < 5; y++)
{
recover:
numerals[x][y] = 30 + rand() % 31;
c = numerals[x][y];
check();
if (f == false)
{
cout << c << "; ";
}
else
{
goto recover;
}

}
}
cout << endl;
system("pause");
return 0;
}

int check()
{
for (a = 0; a < 5; a++)
{
for (o = 0; o < 5; o++)
{
if (c == numerals[a][o])
{
break;
}
else
{
f = false;
}
}
}
return 0;
}
Лень твой код разбирать. Для наглядности 1-25. Поменяешь на свои 30-60:
#include
#include
#include
#define rand(a, b) a + rand() % (b - a + 1)
using namespace std;
const int n = 5, rmin = 1, rmax = 25;
bool exists(int a[n][n], int v){
 bool r = false;
 for (int i = 0; i < n && !r; ++i)
  for (int j = 0; j < n && !r; a[i][j] == v? r = true : r = r, ++j);
 return r;
}
int main(){
 srand(time(NULL));
 int a[n][n] = {0}, v;
 for (int i = 0; i < n; cout << endl, ++i)
  for (int j = 0; j < n; a[i][j] = v, printf("%4d", a[i][j]), ++j)
   for (v = rand(rmin, rmax); exists(a, v); v = rand(rmin, rmax));
 cin.get();
 return 0;
}
IP
Igor Parhimovich
91 376
Лучший ответ
#include <iostream>
#include <unordered_set>
#include <random>
#include <iomanip>
#include <cassert>
using namespace std;
template<typename T, size_t rows, size_t columns>
void fill_integer(T(&matrix)[rows][columns], T left, T right) {
unordered_set<T> box;
auto size = rows * columns;
assert(right - left > T(size));
do box.insert(random_integer(left, right)); while (box.size() < size);
auto iter = box.begin();
for (size_t row = 0; row < rows; ++row) {
for (size_t column = 0; column < columns; ++column) {
matrix[row][column] = *iter++;
}
}
}
template<typename T>
T random_integer(T left, T right) {
if (left > right) swap(left, right);
uniform_int_distribution<T> rand(left, right);
random_device rnd;
return rand(rnd);
}
template<typename T, size_t rows, size_t columns>
void output(T(&matrix)[rows][columns], streamsize width) {
for (size_t row = 0; row < rows; ++row) {
for (size_t column = 0; column < columns; ++column) {
cout << setw(width) << matrix[row][column];
}
cout.put('\n');
}
}
int main() {
const size_t rank = 5;
int matrix[rank][rank];
const auto left = 30, right = 60;
fill_integer(matrix, left, right);
const streamsize width = 3;
output(matrix, width);
cin.get();
}
K*
Kazakh__Kas ***
90 146
От 30 до 60 - 31 целое число. Как можно из этого выбрать 25 НЕповторяющихся?!
Евгений Сычев
Евгений Сычев
66 233
я бы сделал так:
- создал двумерный массив: 1 столбец числа от 30 до 60, 2 столбец 0/1
- выбираю случайно число от 1 до 30, смотрю во второй столбец если там 0 (не выбиралось ранее), значит беру число из первого столбца, если 1 (уже выбиралось) повторяю случайную генерацию
Простой Парень
Простой Парень
53 118