Всем привет.
Возникла необходимость сгенерировать множество размера ~15000 и числами до 300000 в котором все суммы двух различных чисел различны.
Множество {1, 2, 3, 4} — плохое, потому что 2 + 3 = 5 и 1 + 4 = 5.
Множество {1, 2, 3} — хорошее.
Никто не знает как быстро генерировать хорошее множество и возможно ли это вообще?
Различный сумм 600000, а количество пар сильно больше
Ничего не получится из-за принципа Дирихле — всевозможных пар будет гораздо больше, чем 600000 — максимально возможная сумма.
спасибо
Такие множества называются множествами Сидона.
Чтобы сгенерировать множество хорошего размера, можно воспользоваться следующим методом: рассмотрим нечетное простое число p. И тогда можно сделать p чисел вида (i2 mod p) * p * 2 + i + 1 для всех i от 0 до p - 1. Это первый метод, который я вспомнил, вроде есть лучше.
Если интересно, то вот задача на генерацию массива из чисел, у которых количество различных попарных разностей более 90% от всех возможных разностей
Среди решений на данную задачу:
1) Степени чисел с основанием простым числом от 1 до N
2) Степени двойки по модулю
3) Степени тройки по модулю
4) Числа Фибоначчи по модулю
Решение при помощи
std::rand()
дает результат не хуже чем 95%.Странно, rand() ведь только до 32767
std::rand() до RAND_MAX, который 32767 на MinGW и 2147483647 на GNU C++ (например, cygwin, clang, gcc). В любом случае, всегда можно использовать std::rand() * std::rand() * std::rand(). Вот мое решение этой задачи