Если вы можете перечислить все координаты на доске, вы можете использовать любой алгоритм выборки. Вы на сетке 9x9; просто выберите 20 значений из диапазона [0,80] и затем переведите их в координаты сетки:
// Say the number picked is "n"
int x = ((n % 9) - 4) * 2;
int y = ((n / 9) - 4) * 2;
Вы можете использовать любой алгоритм выборки для генерации n
с; проверить ответы на этот вопрос , например.
Преимущество этого подхода перед явным созданием точек состоит в том, что вы можете сэкономить немало памяти (и времени обработки) на больших сетках. Если они действительно большие, а вы выбираете маленькое простое, очевидный алгоритм тоже работает хорошо: просто выберите случайную точку и попробуйте снова, если вы уже выбрали ее. Единственная проблема с этим алгоритмом состоит в том, что он может выполнить довольно много попыток, если вы выбираете большую часть набора.