Создал массив, в который записываются случайные 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;
}
Другие языки программирования и технологии
C++ Двухмерный массив с случайными не повторяющимися числами.
Лень твой код разбирать. Для наглядности 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;
}

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

#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();
}
#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();
}
От 30 до 60 - 31 целое число. Как можно из этого выбрать 25 НЕповторяющихся?!
я бы сделал так:
- создал двумерный массив: 1 столбец числа от 30 до 60, 2 столбец 0/1
- выбираю случайно число от 1 до 30, смотрю во второй столбец если там 0 (не выбиралось ранее), значит беру число из первого столбца, если 1 (уже выбиралось) повторяю случайную генерацию
- создал двумерный массив: 1 столбец числа от 30 до 60, 2 столбец 0/1
- выбираю случайно число от 1 до 30, смотрю во второй столбец если там 0 (не выбиралось ранее), значит беру число из первого столбца, если 1 (уже выбиралось) повторяю случайную генерацию
Похожие вопросы
- C# Дан массив Х из 50 целых чисел.
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- как сделать массив из случайных чисел от 1 до 15 (размерность массива 4х4) что бы они не повторялись в VBA????
- Нужно перемешать массив на C++. Есть массив, его нужно случайным образом перемешать. Нужен именно КОД, а не алгоритм
- Задача по делфи на двухмерный массив.
- Двухмерные массивы(может быть есть добрые люди которые помогут решить)
- c#. Сортировка массива в отдельном методе. Консольное приложение.
- Как отсортировать статический двухмерный массив?
- Язык си, двухмерный массив и функция.
- C++ одномерный массив