- Генераторы случайных чисел
- ТехноБайка: случайны ли случайные числа и как обыграть казино
- Стандартная функция генерации псевдослучайных чисел
- Автомат для игры «Орёл и Решка»
- Автомат «Три семёрки»
- Функция random, randomSeed Ардуино
- random — генерация случайных чисел Ардуино
- Arduino random int
- Arduino random float
- Arduino random bool
- Случайные числа Ардуино randomSeed
- Случайные числа
- Ардуино и случайные числа
- Аппаратный рандом
- Случайный bool
- Видео
- Arduino.ru
- Рандомное включение светодиодов
Генераторы случайных чисел
Если когда-нибудь пытались написать свой Тетрис, сделать электронную свечку или собрать светомузыку — точно использовали случайные числа. Пара строк кода и программа уже выдаёт новую фигурку или яркость светодиода. Всё просто?
На самом деле нет. Компьютер штука умная, но предельно логичная. Выполнить сложную программу, обработать тысячи чисел за долю секунды — никаких проблем, но придумать действительно случайное число компьютер не может. Все «случайные» числа это результат выполнения заранее написанной программы. Поэтому правильнее называть их псевдослучайными.
ТехноБайка: случайны ли случайные числа и как обыграть казино
Стандартная функция генерации псевдослучайных чисел
В проектах на Arduino для получения псевдослучайного числа предусмотрена функция random(). В параметрах функции можно задать диапазон получаемых значений, от минимального до максимального.
Если вы запустите этот скетч, увидите, что после каждого перезапуска платы последовательность чисел будет повторяться. Чтобы последовательность не повторялась, необходимо запустить генератор случайных чисел со случайным параметром. Для этого предусмотрена функция randomSeed(). В качестве параметра функции зададим номер свободного аналогового пина. Шум с него инициализирует генератор случайных чисел.
Автомат для игры «Орёл и Решка»
Это самый простой игровой автомат. Arduino Uno, пара светодиодов и тактовая кнопка. Нажимаете кнопку — случайным образом загорается один из светодиодов: или красный, или зелёный. Угадали какой загорится, можно подавать заявку на участие в «Битве экстрасенсов».
В проекте использовались:
Автомат «Три семёрки»
Игровой автомат генерирует трёхзначное число. Если всецифры в нём совпали — Bingo! Если нет, попробуйте свою удачу ещё раз.
Игровой автомат собран в образовательных целях. Использовать подобные устройства для получения прибыли запрещено законами Российской Федерации.
Источник
Функция random, randomSeed Ардуино
Функция random Ардуино возвращает псевдослучайное число, то есть последовательность генерации случайных чисел все таки предсказуема. Функция randomSeed позволяет поместить переменную или константу в функцию random, чтобы генерировать более случайные значения. Разберемся в этой статье, как в языке программирования Arduino IDE задать рандомное число в диапазоне правильно.
random — генерация случайных чисел Ардуино
Функция random (min, max) позволяет вернуть псевдослучайное число в диапазоне, заданном значениями min и max. Разберем примеры с разными типами данных.
Arduino random int
В представленном примере выбран тип данных byte, хранящий целые числа в диапазоне от 0 до 250. Можно использовать и другие типы данных: int, long, unsigned long, unsigned int и другие. Соответственно задается нужный диапазон (min, max).
Arduino random float
Генерировать микроконтроллер может только целые числа. Поэтому чтобы получить тип данных float с двумя знаками после запятой, следует отдельно генерировать целое число и добавлять к нему десятичные дроби. Пример такой программы:
Arduino random bool
Если нужна случайная переменная boolean, которая может принимать только два значения true или false. То можно генерировать случайное true/false с заданной вероятностью. Просто присваиваем переменной bool результат функции random, в которой указываем число, обратное вероятности получения false. Пример:
Случайные числа Ардуино randomSeed
Обратите внимание, что во всех примерах, представленных выше, при каждом перезапуске программы случайная последовательность чисел повторяется. Этого можно избежать, используя функцию randomSeed Arduino. randomSeed позволяет поместить переменную в функцию random. Для этого используют millis, analogRead или другие варианты, позволяющие сделать генерацию чисел более случайной.
При каждом перезапуске программы генератор псевдослучайных чисел будет инициализироваться функцией randomSeed(analogRead(A1)); со случайного значения из-за «шума» на порту. Можно использовать любой свободный порт для этого, так как все аналоговые выводы воспринимают случайный шум из окружающей среды — радиоволны, электромагнитные помехи от компьютеров, сотовых телефонов и т.д.
Источник
Случайные числа
Я думаю понятие случайных чисел/величин вам знакомо: они случайны. Иногда в самодельном устройстве бывает нужна случайная величина, например для какой-нибудь игры или световых эффектов. Программный источник настоящих случайных чисел организовать весьма непросто, в отличие от аппаратного. Банально игральный кубик или лото-машина являются вполне себе хорошими источниками случайных чисел. Микроконтроллер к слову не может генерировать случайные числа, потому что он – точное вычислительное устройство, случайностей быть не может. Что делать? Использовать такое понятие, как псевдослучайные числа. Чем они отличаются от случайных? Своей природой. Псевдослучайное число получается путём различных математических действий с начальным числом, то есть имея начальное число, мы можем сгенерировать на его основе целую кучу других чисел. Но тут есть две проблемы:
- Через какое-то количество чисел (тысяч, а может и миллиардов, а может и больше) ряд сгенерированных псевдослучайных чисел начнёт повторяться. Для наших целей это не так страшно, можно об этом не думать
- Генератору псевдослучайных чисел нужно начальное случайное число. Вот это реально беда… Но ничего, у нашего микроконтроллера есть и аппаратные средства
Ардуино и случайные числа
Ардуино имеет пару готовых функций для работы с псевдослучайными числами, давайте на них посмотрим:
- random(max); – возвращает псевдослучайное число в диапазоне от 0 до ( max – 1 ). max принимает unsigned long , то есть от 0 до 4 294 967 295
- random(min, max); – возвращает псевдослучайное число в диапазоне от min до ( max – 1 ). max принимает unsigned long , то есть от 0 до 4 294 967 295
- randomSeed(value); – дать генератору псевдослучайных чисел новую опорную точку для отсчёта. value – любое число типа unsigned long , значит на Ардуино мы имеем 2^32 (4 294 967 295) наборов псевдослучайных чисел. На ваш век этого точно хватит!
Как правильно генерировать случайные числа, чтобы последовательность каждый раз была новая? Есть варианты:
- При запуске программы задавать случайное число в randomSeed() . Как это сделать? Расскажу ниже
- Если устройство как-то взаимодействует со внешним миром, или даже с пользователем, то можно при наступлении некоторых аппаратно случайных событий (нажатие кнопки, срабатывание датчика, принятие данных, и т.д.) скармливать randomSeed‘у текущее время с момента старта программы, т.е. функции millis() или micros() . Отличное решение кстати! Банально вызываем randomSeed(micros()) и всё.
Аппаратный рандом
Помните, в уроке про цифровые пины я говорил, что если пин никуда не подключен – то он ловит “из воздуха” всякие наводки. Шумы имеют природу, близкую к случайной, и было бы глупо этим не воспользоваться! Давайте посмотрим, какие значения можно получить с никуда не подключенного аналогового пина, опрашивая его обычным analogRead();
Но есть ещё интересный вариант, который позволит получить гораздо более случайные числа для randomSeed() . Есть информация, что первые два бита из результата analogRead() имеют самый большой шум. Давайте на него посмотрим, выведя несколько (300) результатов в график. Получить первые два бита можно так: analogRead(A0) & 0b0000011 , или более коротко – analogRead(A0) & 3
Именно такой код я рекомендую использовать для получения случайного зерна для генератора случайных чисел при запуске программы. Напоследок давайте посмотрим, какой результат даёт такая конструкция:
График я построил в excel, чтобы более чётко видеть рассеивание полученного случайного значения
Случайный bool
Иногда бывает нужен случайный флаг, то есть true / false . Делается это очень просто: в уроке про условия я рассказывал, что bool ( boolean ) принимает true при любом отличном от нуля значении. Это можно использовать для получения случайного true / false с заданной вероятностью! Просто присваиваем логической переменной результат функции random() , в которую передаём число, обратное вероятности получения false :
Переменная rndFlag получит значение false с вероятностью 1/5, то есть 20%. Если нужен true с низкой вероятностью – используем инверсию:
Теперь переменная rndFlag получит значение true с вероятностью 10%.
Видео
Источник
Arduino.ru
Рандомное включение светодиодов
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Здравствуйте.
Помогите решить задачку.
Нужно рандомно по очереди по одному включать 10 светодиодов каждые 5 секунд. И при необходимости, также рандомно по одному выключать.
функция «рандом» не подойдет, так как она может повторять значения из диапазона (от 1 до 10).
Хотя бы подскажите куда копать.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подойдет, если не полениться и дописать пару строчек, обеспечивающих требуемые условия.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Я не знаю как исключить из диапазона рандома те светодиоды которые уже включены.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Хотя если подумать то наверное можно.
Но что-то в две строчки пока не помещаюсь, точнее далеко не в две)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Так а в чём именно проблема? Как узнать, включен ли светодиод по номеру, который вернул random? Заводите массив на 10 светодиодов. Заводите переменную — счётчик, которая хранит номер текущей ячейки для записи в массив. Как надо включить — начинаете бесконечный цикл, внутри которого: получаете рандомное число, проверяете, есть ли оно в ячейках до счётчика. Если есть — получаете новый random. Если нет — зажигаете светодиод, пишете номер, полученный random, в ячейку, на которую указывает счётчик, увеличиваете счётчик на 1, вываливаетесь из цикла. Проверяете — если счётчик равен 10 — зажгли все светодиоды.
Тушить — примерно в том же разрезе.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Похоже как люди садятся писать программу, то здравый смысл их оставляет.А может его и не было изначально. ведь живут же люди без здравого смысла и это не смертельно. Вот мне представляется можно выбрать один из вариантов. 1 тогда их можно выключить. 2 передернуть рандом еще раз.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Заводите массив на 10 светодиодов. Заводите переменную — счётчик,
Тушить — примерно в том же разрезе.
Спасибо, буду пробовать.
С массивом должно получиться компактнее.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Хорошая задача, интересная, в плане обучения и получения навыков разработки простейших алгоритмов. Удачи Вам 🙂
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Так а в чём именно проблема? Как узнать, включен ли светодиод по номеру, который вернул random? Заводите массив на 10 светодиодов. Заводите переменную — счётчик, которая хранит номер текущей ячейки для записи в массив. Как надо включить — начинаете бесконечный цикл, внутри которого: получаете рандомное число, проверяете, есть ли оно в ячейках до счётчика. Если есть — получаете новый random. Если нет — зажигаете светодиод, пишете номер, полученный random, в ячейку, на которую указывает счётчик, увеличиваете счётчик на 1, вываливаетесь из цикла. Проверяете — если счётчик равен 10 — зажгли все светодиоды.
Тушить — примерно в том же разрезе.
1. Заводим массив на 10 элементов.
2. Заносим в массив числа от 1 до 10.
3. Используя random (*) перемешиваем массив.
В результате у нас в массиве в случайном порядке будет 10 уникальных чисел, каждое — ровно по одному разу. И, самое главное, без всяких бесконечных циклов.
(*) Примечание: где взять случайное число в микроконтроллере — вопрос отдельный.
PS. Если нам нужна перемешанная колода карт, как мы будем поступать?
1. Соберем 100500 колод вместе, высыпаем в большую емкость, будем из емкости выбирать по одной карте, проверяя, не встретилась ли повторная.
Источник