C/C++

Уникальные координаты Си

В общем, я через rand() генерирую "типа случайные числа" для координат X и Y

день потратил не могу понять, почему не получается сделать уникальные, не повторяющиеся координаты в массиве

В функции time использовать нельзя

Как это правильно делается? Спасибо
Каждый раз когда добавляешь в массив новое число, проверяй есть ли он уже в в массиве если да, то рандомь повторно (погугли что такое рекурсия). Кинь свой код, поможем исправить.
АШ
Александр Швец
706
Лучший ответ
Александр Кобылкин О а вот этот коммент был полезным, ща гляну
Александр Кобылкин Я как-то так и делал, но чет не получается
Александр Швец Нужна уникальность в каждом массиве отдельно или в обеих? (то есть могут быть две координаты с одинаковым числом? Например arrX[i] == 25 и arrY[i] == 25
Александр Кобылкин Я заполняю сетку допустим 100 на 50 - оно может меняться, зависит от прихоти моего препода. Заполняю точками, и эти точки не должны пересекаться . Каждая точка это структура в которой есть координата X и Y
Александр Кобылкин Но прикол в том что, вся сетка может быть заполнена точками, и они не должны пересекаться используя функцию rand()
Александр Швец На будущее. В таких задачах лучше использовать рекурсию (это когда функция будет вызывать сама себя до тех пор пока выполняется какое-то условие). Например, в этом случае, пока находятся одинаковые пары, массив будет проверятся заново до тех пор, пока они не закончатся. Главное, быть осторожным и не сделать бесконечную рекурсию)))
Александр Швец Если не получится встроить мой код, закинь свой на этот сервис — ideone.com (нужно выбрать язык С) и кинь сюда ссылку. Тогда я попытаюсь помочь и с этим)
Александр Кобылкин А Так спасибо большое =)
Потому, что случайное число НЕ гарантирует уникальности. На то оно и случайное, что может повторяться.
Хочешь уникальности - сформируй массив различных координат и перемешай его случайным образом:
ru.wikipedia.org/wiki/%D0%A2%D0%B0%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D0%B8%D1%88%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%99%D0%B5%D1%82%D1%81%D0%B0
В Windows попробуйте вот так...

#define _CRT_RAND_S
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define BUFFER 24
#define RAND(rnd, min, max) ((int)(rnd % ((max) - (min)) + (min)))
typedef struct {
int x;
int y;
} Coord;
_Bool contains(int x, int y, Coord* a, int n) {
int i;
for (i = 0; i < n; ++i) {
if (a[i].x == x) return true;
if (a[i].y == y) return true;
}
return false;
}
int main(void) {
Coord box[BUFFER];
unsigned rnd = 0;
int i = 0;
Coord a;
do {
rand_s(&rnd);
a.x = RAND(rnd, -99, 99);
rand_s(&rnd);
a.y = RAND(rnd, -99, 99);
if (contains(a.x, a.y, box, i)) {
--i;
continue;
}
box[i] = a;
} while(++i < BUFFER);
for (i = 0; i < BUFFER; ++i) {
printf("%3i %3i\n", box[i].x, box[i].y);
}
system("pause > nul");
}
Простейший вариант - после генерации нового псевдослучайного значения проверяешь, нет ли его уже в массиве, и если есть, отбрасываешь. Более цивилизованный - использование алгоритмов тасования упорядоченной последовательности.
Yulian Dimkov
Yulian Dimkov
58 971
плохой алгоритм..