Лотерея – такая это форма игры, которая главным образом включает в себя розыгрыш комбинации цифр. Сегодня существует большое количество различных лотерей, отличающихся нюансами и процессом проведения, но главным остается случайное распределение цифр, определяющее победителя.

Такой вид времяпрепровождения очень интересен и захватывающ. Более того, его можно организовать самостоятельно с помощью популярной в наши дни платформы для разработчиков и радиолюбителей Arduino. Реализовав генератор случайных чисел на Arduino, можно сделать некое подобие довольно интересной лотереи.
В данном материале будет описан проект под названием Randuino, то есть Arduino с имплементацией генератора случайных чисел (random number generator), который позволит вновь и вновь получать новые числа, совершенно не похожие на предыдущие цифры. Как раз именно это является залогом настоящей лотереи, поскольку генерируемые новые числа не должен знать никто. В качестве средства отображения таких чисел используется стандартный двухстроковый LCD-дисплей.
Прежде чем приступить к демонстрации кода, следует уточнить, как именно получаются такие случайные числа. Дело в том, что структура ядра микроконтроллера (как и у всех компьютеров и прочих вычислительных устройств, основанных на кремниевой технологии) является «жесткой», то есть все вычисления здесь строго детерминированы и отсутствует вообще любой элемент случайности. В связи с этим использовать само ядро микроконтроллера для генерации случайных чисел, которые будут лишь псевдослучайными, нельзя, поскольку такую лотерею можно будет запросто взломать, просто поняв последовательность, с которой генерируются новые числа.
Поэтому нужно искать источник настоящих случайностей извне. И его можно найти с помощью АЦП. Дело в том, что документация на Arduino предполагает, что аналоговые линии микроконтроллера могут обнаруживать имеющиеся вокруг нас микроволновые или радиоволновые сигналы, которые после их поступления на канал АЦП можно выразить как число от 0 до 1023, а затем использовать это число в качестве основы для генерации случайных чисел. В итоге только такой механизм позволит реализовать настоящую лотерею, подобную pubg лотереи. Код для Arduino с генератором случайных чисел для построения механизма лотереи представлен ниже.
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
const int seedPin = A0;
const int button = 2;
int buttonState;
int prevButtonState;
int totalNumbersGenerated = 0;
void setup() {
lcd.begin (16,2);
pinMode (seedPin, INPUT);
pinMode (button, INPUT);
int randSeed = analogRead (seedPin);
int generatedSeed = random (-randSeed, randSeed);
randomSeed (generatedSeed);
prevButtonState = digitalRead (button);
PrintToLcd (
"Rng: " + String (-randSeed) + " - " + String (randSeed),
"Seed: " + String (generatedSeed)
);
}
void loop() {
buttonState = digitalRead (button);
if (buttonState != prevButtonState && buttonState == HIGH)
{
totalNumbersGenerated++;
PrintToLcd (
"Result #" + String (totalNumbersGenerated),
String (random (-999999999, 999999999))
);
delay (200);
}
prevButtonState = buttonState;
}
void PrintToLcd (String line1, String line2)
{
lcd.clear ();
lcd.print (line1);
lcd.setCursor (0, 1);
lcd.print (line2);
}
© digitrode.ru