Есть число, большущее, 65535 бит, не меньше. Число подчиняется кое-какой статистике (вернее, биты в нем), это не случайные биты.
Нужно сгенерировать код на языке Си, который:
Состоит из множества функций, которые вызывают друг-дружку
Функции занимаются вычислением вышеозначенного большого числа, используя какой-то случайный алгоритм. Например, число 7:
int func_123(void *context, .... ) {
int tmp = 10;
tmp -= func_143();
tmp = func_333(sqrt(float(tmp))); //результат вызова - число 7
...
}
Результат работы - массив, заполненный нужными битами.
Сложности у меня возникли с тем, чтобы генерируемые алгоритмы не были похожи друг на дружку. Шаблонность недопустима! :).
В идеале получить бы портянку арифметических/тригонометрических/fft/пр. операций, переходов, циклов, и пр. Желательно, так же, чтобы время на вычисление числа было солидным. Ну, скажем, секунду. Или больше. Без delay(), а именно вычислительной нагрузкой.
Пишите, если есть идеи. Рассматриваем любые фантазии.
А если серьезно, то два требования “биты числа подчиняются кое-какой статистике” и “какой-то случайный алгоритм” противоречивы. Я полагаю, вас с таким пониманием задачи устроит любой алгоритм. Выше я предложил решение.
Похоже это не число, а просто массив бит. Подходить к заполнению массива как вычислению огромного числа - совершенно излишнее усложнение, вы так только запутываете других и себя.
Любая случайность - неслучайна.
В систему случайности могут приходить извне.
…много разных датчиков и снимаем с них значения, желательно с точностью, выходящей за погрешность приборов
датчики-модули: часы, термометр, барометр, компас на хвосте собаки…
Если написать этот ответ в массив бит с некоторой статистической закономерностью, то биты в массиве будут подчиняться какой-то статистике, что и задано условием задачи.
void setup() {
Serial.begin(115200);
uint8_t mass[1024];
uint8_t chkByte;
for(uint16_t i = 0; i < 1024; i++ )
chkByte += mass[i];
Serial.println(chkByte);
}
void loop() {
// put your main code here, to run repeatedly:
}
При каждом новом включении выдаёт новое число - 78 , 110, 143, 169, 31, 207, 178…
Единым скрином не выложу, т.к. приходится при новом подключении (Nano к USB)каждый раз закрывать-открывать монитор
Если сразу ресет - значение не меняется, что ожидаемо.
в принципе да. но желательно, чтобы он был не вырожденный не простой.
Допустим, мне нужно сгенерировать число 0x1234:
Могу выичислить его так:
a = 0x1233 + 1;
/то - слишком просто, \то - вырожденный алгоритм.
Что мы вычисляем:
У нас есть заданное число, которое представляет собой машинный код.
который будет исполнятся и что-то там делать (расшифровывать основное тело, например)
Есть большое число, “искомый результат”, оно известно заранее и не менеяется никогда. Это число НЕ случайное и на самом деле это число является машинным кодом, который потом будет исполнятся.
Result := “0x909090909090909090909090” // Intelx86 NOP; NOP; NOP;…
Нужно:
Найти нетривиальный, рандомный алгоритм, который из числа RandomNumber делает число Result. Число RandomNumber вшито в этот рандомный алгоритм. На выходе, после работы должен получиться Result
Желательно, чтобьы вычисления были ДОЛГИМИ. Не обяхательно запутанными, но долгими.
Т.е. нужен алгоритм, который будет генерировть “рандомный” код, который преобразует RandomNumber в Result:
Книжку основ криптографии изучите. Тут даже на пальцах обьяснять не имеет смысла. Все что вы сделаете не имея классических знаний по криптографии будет уровня куличика из песка в детском саду.