Я хотел бы сгенерировать серию случайных чисел с помощью препроцессора C и сохранить их в переменных для использования в моей программе.
ЗАДАЧИ:
Я хотел бы генерировать «уникальный» набор случайных чисел каждый раз, когда я создаю свою программу. Небольшое подмножество переменных, хранящих случайные числа, будет перезаписано значимыми (то есть неслучайными) числами. Я бы хотел, чтобы хакер, отлаживая программу или сравнивая несколько сборок, не мог отличить значимые числа от случайных. Я бы хотел, чтобы процесс сборки был автоматизированным и автономным. Я хотел бы, чтобы реализация была переносимой в Visual Studio и GCC.
РАЗЪЯСНЕНИЯ:
- Вычисления должны выполняться во время компиляции, а не во время выполнения программы. Любой, кто занимается отладкой программы, должен видеть, например, только то, что переменная инициализируется константой (случайным числом).
- Случайные числа должны быть целыми.
- Генератор случайных чисел должен быть каким-то образом засеян из
__DATE__
и__TIME__
, чтобы разные сборки давали разные случайные числа. - Было бы предпочтительно, но не обязательно иметь возможность указать диапазон для случайных чисел (например, от 1 до 100).
- Было бы предпочтительно, но не обязательно иметь возможность указать общее количество случайных чисел для генерации (например, объявить 1000 переменных и инициализировать каждую случайным числом).
ПЫТАЕТСЯ ТАКОЕ:
- Предыдущая тема по арифметике в препроцессоре: Может ли препроцессор C выполнять целочисленную арифметику? Вывод состоит в том, что условие #if может оценивать арифметические операции.
- Поиск в Google показывает, что помимо арифметических операций сдвиг и бит также могут оцениваться с помощью #if. Я подтвердил это с помощью Visual Studio C ++.
Кандидаты в простые генераторы случайных чисел: http://www.ciphersbyritter.com/NEWS4/RANDC.HTM#[email protected] Подойдет любой из этих генераторов или любой генератор, который невозможно реконструировать из данной серии случайных чисел. потому что мне не нужен особенно хорошо работающий генератор. Для этого упражнения мы можем использовать в качестве примера следующее:
unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567)
Я думаю, что основная проблема заключается в том, что между последовательными вызовами генератора в переменной jcong сохраняется состояние. Насколько мне известно, назначение переменных не поддерживается препроцессором. Может быть, есть какой-нибудь умный рекурсивный макрос, который поможет?
Самое близкое, что я мог получить, но не удовлетворяющее моей цели выполнения препроцессором, это:
unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567};
Я подтвердил в Visual Studio C ++, что это действительно инициализирует элементы массива разными случайными числами. Однако отладчик по-прежнему выполняет инициализацию.
Это чистый вопрос программирования / реализации, поэтому, пожалуйста, не обращайте внимания на зло препроцессора или тщетность борьбы с хакерами.