Функция генерации случайного значения для Attiny13A
МК Attiny13A не поддерживает функцию random из-за ее большого размера, т.к. в этой микросхеме всего 1024 байт памяти на всю программу. Но иногда необходим генератор хотя бы случайного битного значения: 0 или 1. Такой генератор случайного значения может быть использован в игре Магический куб. При нажатии на кнопку загорается или зеленый или красный светодиод.
Функция на IDE Arduino
boolean random_boolean()
{
// Для пущей надежности будем читать случайные значения с 2 аналоговых пинов микросхемы
pinMode(4, INPUT); // Пин 4 на чтение
pinMode(2, INPUT); // Пин 2 на чтение
int v1 = analogRead(2); // Первое значение
int v2 = analogRead(4); // Второе значение
int v3 = analogRead(2)-1000; // Третье значение
int v4 = analogRead(4)-1000; // Четвертое значение для верности
// Выполняем действия в скобках над переменными и смотрим четность или нечетность полученного результата
if ( ( v1 % v2 % v3 % v4 ) & 1 ) { return true; } else { return false; }
}
Конечно, код можно упростить, но так будет понятнее что и зачем.
Замечу, что значения берутся с аналоговых пинов и поэтому каждая микросхема может вести себя по-разному.
Тест на случайность
Было сгенерировано 9000 нажатий. Положительных ответов 57%, отрицательных 43%. Данные были разделены на группы по 1000 элементов и был проведен расчет корреляции между всеми возможными парами столбцов. Средний коэффициент корреляции получился -0,00927, что говорит об почти полном отсутствии связи между последовательностями ответов.
Считаю, что данный вид случайной генерации можно считать приемлемой.