Здравствуйте.
А кто-то занимался генерацией случайных чисел?
Не генератором псевдослучайных чисел, а именно случайных.
Заморочка такая:
Имеем 8ми битный таймер, который мотает себе по кругу. Нажимаем кнопку,
считываем таймер - имеем Случайное число. Восьмибитное.
А мне надо к примеру трехбайтное. Как быть?
На борту имею Только восьмибитный таймер. Ну такой контроллер, и поменять
его нет возможности. Выхода нет?
PANYTA писал(а):
Заморочка такая:
Имеем 8ми битный таймер, который мотает себе по кругу. Нажимаем кнопку,
считываем таймер - имеем Случайное число.
имеем псевдослучайное число
Ничего подобного. Если кнопка нажимается человеком ( не программой ), число в чистом виде - случайное. Псевдослучайное получается перебором по определенному алгоритму чисел, начиная с начального значения, и если это начальное значение при каждом запуске одно и то же - получаем одну и ту же последовательность. Этим пользуются при отладке устройств ( программ ), потому что если использовать чисто случайную последовательность, возникает неопредеденность : изменение поведения устройства ( программы ) вызвано вносимыми в нее при отладке изменениями -- или же это реакция на другую случайную последовательность.
PANYTA писал(а): Нажимаем кнопку
- Вот это ключевой элемент. Генератором случайных чисел в этом случае будет человек, нажимающий кнопку, а таймер только фиксирует результат.
Последний раз редактировалось Jack_A Вт мар 06, 2012 18:42:43, всего редактировалось 1 раз.
Можно использовать , например , дребезг контактов кнопки или состояние таймера в момент нажатия и отпускания кнопки и количество циклов таймера между ними.
kotpalych писал(а):Можно использовать , например , дребезг контактов кнопки или состояние таймера в момент нажатия и отпускания кнопки и количество циклов таймера между ними.
Или запустить генератор псевдослучайных чисел со сколь угодно большим интервалом апериодичности, а нажате кнопки будет случайным образом "выхватывать" из этой последовательности число, которое в результате получит "двойную рандомизацию" - от алгоритма и от человека.
я бы использовал число из таймера для инициализации стандартной для Си функции rand() - а уже после инициализации генератора с ее помощью получать случайное чесло нужной разрядности. если считать переполнения таймера то при определенном навыке в нажимании кнопки можно получить не случайные, а очень близкорасположенные числа. а с rand() это получится вряд ли.
битва с дураками проиграна, победители торжествуют. слава победителям!
Я тоже сейчас делаю одну штуку на МК и мне понадобилось случайное чило. Изначально план был такой: спаять мультивибратор (или еще какой-нибудь генератор) с частотой в несколько раз выше тактовой. Когда в программе понадобится случайное число - хватать поочереди лог. уровни с него и пихать в байт. Правда, прийдется отслюнявить под это дело лишнюю ножку, но зато можно нагенерировать сколько угодно байт и независимо от нажатий кнопки.
Хотя теперь я наверное, сделаю с какого-нибудь таймера - это попроще будет.
Чёт я об этом не подумал... Тут и три байта можно , и больше.
Спасибо
есть ещё вариант:
генератор шума (Д814 на малых токах шумят как сволочи) - триггер Шитта
а)- вход ICP счетчика T1 (применительно к АВРкам) - превышен порог в ICR некоторое число, N последовательных чтения получаем N*2 байтное случайное число
б) счетный вход + таймер формирующий образцовый интервал ( недостаток 2 таймера)
в) вход INTx + счетчик, по прерыванию считываем значение счетчика.
...
наверняка кто-то ещё предложит кучу способов, выбор за вами.
"стандартное" решение см. "Искусство схемотехники" от Хоровица/Хилла
программный вариант до N байт длиной
весьма симпатично выглядят 8 таких ГСЧ с выдачей данных в общий байт для светиков... правда голова потом может ...