Страница 1 из 6
Генератор случайных чисел.
Добавлено: Вт янв 01, 2008 23:44:13
regenerator
Приветствую всех! Ещё раз с Новым Годом.
А теперь к делу:
мне нужно что-то вроде электронных костей, но только чтоб они работали без постороннего вмешательства(во всех схемах, что я видел имелась кнопка, нажимая на которую счётчик прекращал работу). Устройство должно быть сделано на одном МК. И зажигать через каждые две секунды один из шести светодиодов (при этом вероятность того, что кто-то сможет угадать, какой светодиод загорится, должна составлять 1 к 6).
Я не прошу делать всё за меня! Дайте, пожалуйста, идею как осуществить это программно.
ЗЫ: Охотно принимаются ссылки на готовыё устройства!

Добавлено: Вт янв 01, 2008 23:53:45
ARV
самый простейший с точки зрения напряжения мозга способ: всю свободную память МК заполняешь случайными числами, которые сгенерировал, например, в Экселе в виде таблички (или вручную, кидая реальную кость

). по моим прикидкам там поместится никак не меньше 4000 чисел. В основной программе просто каждые 2 секунды берешь из этого "массива" очередное число и выводишь его

вряд ли кто сумеет предугадать последовательность из 4000 чисел.
А вот реализовать математически формулу, генерирующую псевдослучайную последовательнсоть чисел, будет посложнее, т.к. придется вспоминать математику и, может быть, даже высшую

Добавлено: Вт янв 01, 2008 23:56:52
regenerator
Первый вариант мне очень понравился, но писать такую программу - рука отвалится...
Добавлено: Ср янв 02, 2008 00:20:04
Паятель
А обязательно на МК? Можно ведь сделать генератор шума
http://www.cryogenius.com/hardware/rng/
Добавлено: Ср янв 02, 2008 00:31:02
regenerator
Да. МК - это одно из главных требований к устройству.
ЗЫ: А на русском можно, а то в английском я полный нуль.
Добавлено: Ср янв 02, 2008 06:58:05
ИРБИС
МК, МК...
Реализуется на всём, чём угодно. К155ЛА3, например. И не МК нужен, и не о случайных числах речь в данном случае идёт.
Смотрите такову науку: "Численные методы" называется. Алгоритмы генерации
псевдослучайных чисел. Почему "псевдо"? Да потому, что мы сможем генерировать эти числа с определенным периодом и заданным распределением из-за того, что численные методы используются.

Добавлено: Ср янв 02, 2008 07:39:01
therian
МЯУ какое интересное решение, жаль что аж целых 12 воль надо
а перевернутый транзистор в роли диода ?
Добавлено: Ср янв 02, 2008 11:26:38
ИРБИС
А вот вам и на К155ЛА3 — в школьных кружках раньше собирали. Нажмёшь кнопку — число фиксируется.
Количество игральных костей и варианты индикации — кому какие нравятся! Здесь на ИН-ках сделано.

Добавлено: Чт янв 03, 2008 13:44:54
regenerator
ИРБИС писал(а):А вот вам и на К155ЛА3 — в школьных кружках раньше собирали. Нажмёшь кнопку — число фиксируется.
Разве схема только на ЛА3? А ИЕ2 и ИА1 так, посивные элементы. И я же русским языком писал, что видал я такие схемы(с кнопкой), а мне без кнопки нужно.
Добавлено: Чт янв 03, 2008 14:01:15
ИРБИС
regenerator писал(а):Разве схема только на ЛА3? А ИЕ2 и ИА1 так, посивные элементы. И я же русским языком писал, что видал я такие схемы(с кнопкой), а мне без кнопки нужно.
Да. Сама схема именно на ЛА3, остальное — это индикация. И микросхема там ИД1, а не ИА1. Плохо напечатано, понимаешь?

Вместо кнопки можно транзисторный ключ поставить. Управлять им можно от таймера, вам через 2 с индикацию нужно?

555 (КР1006ВИ1) или 7555 (КР1441ВИ1) прекрасно справятся с этой задачей!

Индикацию, как я уже говорил, какую хочешь, ту и делай.
Удачи!

Добавлено: Чт янв 03, 2008 14:21:59
regenerator
Если я поставлю таймер, то он будет останавливать генерацию через равные промежутки времени, и каждый раз будет выводиться одно и то же число. Человек не может с такой точностью нажимать на кнопку, поэтому кажется, что числа выдаваемые устройством - случайны.
Добавлено: Чт янв 03, 2008 14:31:34
regenerator
Спасибо всем, кто участвовал в теме! Проблема с генератором случайных чисел разрешилась.
Сделал всё по совету ARV, а именно сам кидал кубик и записывал все варианты в микроконтроллер, пока набрал около сотни чисел, но результат - превосходный, думаю, что 4 тысячи чисел писать не буду, трёхсот вполне хватит.
Ещё раз спасибо!
Я писал(а):Первый вариант мне очень понравился, но писать такую программу - рука отвалится...
Не отвалилась.

Добавлено: Чт янв 03, 2008 14:32:24
ИРБИС
regenerator писал(а):Если я поставлю таймер, то он будет останавливать генерацию через равные промежутки времени, и каждый раз будет выводиться одно и то же число.
Частота генератора довольно большая, таймер аналоговый, так что достаточно случайно получаться должно.

В целом замечание верное.
Есть хорошая книга, её "Библией для программистов" называли: Д.Кнут "Искусство программирования для ЭВМ". Советую прочитать. Её недавно в очередной раз переиздали, но стоит конечно...

Но здесь:
http://www.radiokot.ru/forum/viewtopic.php?t=466 вроде бы мелькала, хотя три тома весят...

Добавлено: Ср сен 17, 2008 13:25:48
Demon
regenerator да вы терпеливый человек
Ну хоть и поздно может кому пригодится.
Одним из простых способов как можно сгенерировать ряд псевдо случайных числел следующий:
Берем ряд чисел Фибоначчи(следующее число получается сложением двух пpедыдущих) :
13, 21, 34, 55, 89, 144, 233...
И далее берем допустим только второй знак числа и получаем ряд псевдо случайных чисел:
3,1,4,5,9,4,3...
Добавлено: Ср сен 17, 2008 13:53:51
RST
Есть генератор псевдослучайных чисел у Хоровица с Хиллом.
Добавлено: Ср сен 17, 2008 17:11:09
ARV
буквально недавно мне пришлось самому последовать своему совету - срочно и быстро надо было сделать псевдослучайную последовательность... хотя с формулой у меня проблем нет - решил все-таки табличный способ, т.к. дополнительно было необходимо всю память, не занятую программой, заполнить "мусором". так вот, решение задачи, как говорится, в пять шагов:
1. Открываем эксель
2. вводим в рядом стоящие клетки по горизонтали следующее (квадратными скобками я обозначил клетки):
[.db] [=СЛЧИС()*255]
3. форматируем вторую клетку, чтобы в ней число было округлено до целых
4. выделяем пару этих клеток, цепляем мышкой за правый нижний угол выделения и растягиваем выделение вниз на сколько надо клеток (мне было надо на 512). получаем таблицу случайных чисел.
5. выделяем эту таблицу, копируем в буфер обмена, переключаемся в редактор программы для МК и делаем "вставить" - вуаля! таблица из 512 случайных чисел (для ассемблера) готова!!! и руки не отваливаются абсолютно!!!
для пишущих на Си алгоритм точно такой же, только сначала вводим =СЛЧИС()*255 а затем в клетку рядом - запятую. после копирования надо будет лишь перед таблицей добавить char random[] = { и после таблицы поставить закрывающую фигурную скобку. Кстати, если умножать на 65535 - можно получить случайные числа unsigned int
в общем, дешево и сердито. для экономии места в программе оформить таблицу можно в виде include-файла
Добавлено: Ср сен 17, 2008 17:55:09
Kotische
Вообщето, норманьные генераторы случайных чисел (
не псевдо) делаются так. Берётся шумящий элемент -резистор, транзистор, стабилитрон. Сигнал усиливается и подается на компаратор.
Дальше, в течении некоторго большого интервала времени, считают количество импульсов и если количество четное - полагают что получен бит-0, а если нечётное - полагают что получен бит-1.
Получается настоящая случайная
битовая последовательность, которую можно нарезать на числа, по n-бит
Можно сигнал с шумящего стабилитрона усилить и подать на АЦП, откинуть старшие разряды, а мадшие будут представлять из себя неплохой цифровой шум!

Добавлено: Ср сен 17, 2008 18:29:49
akl
Здравствуйте. Может кому пригодится в случае, когда нужно экономить память программ. Собственно генератор псевдослучайной последовательности находится в обработчике прерывания TIM0.
Добавлено: Ср сен 17, 2008 19:06:06
ARV
akl, вы бы хоть пояснили, в каких регистрах у вас само число получается... я вот взял и протестировал в студии - нифига не псевдослучаное там получается... ессли вначале все регистры обнулены - вообще так они и остаются, а если в ZL не ноль - что-то получается в ZH:ZL, но на случайное похоже мало... во всяком случае при начальном значении ZL=2 получается последовательность чисел больше 255 однозначно - т.е. явно не очень случайное распределение...
и вообще, алгоритм какой-то странный у вас...
Добавлено: Чт сен 18, 2008 17:12:47
akl
ARV писал(а):akl, вы бы хоть пояснили, в каких регистрах у вас само число получается... я вот взял и протестировал в студии - нифига не псевдослучаное там получается... ессли вначале все регистры обнулены - вообще так они и остаются, а если в ZL не ноль - что-то получается в ZH:ZL, но на случайное похоже мало... во всяком случае при начальном значении ZL=2 получается последовательность чисел больше 255 однозначно - т.е. явно не очень случайное распределение...
и вообще, алгоритм какой-то странный у вас...
ARV
Вторая строчка сверху
"; Регистры ZH ZL генератор псевдослучайной последовательности"
Спасибо за тестирование программы!
Каюсь, при убирании ненужного в этой программе стер начальную установку пары ZH:ZL в любое, отличное от 0xFFFF, значение, которое является запрещенным. Значение 0 входило в область необходимых, поэтому и был выбран этот алгоритм, но откуда он был взят??? не помню.
Последовательность чисел, получаемая после прерывания TIM0 в паре ZH:ZL 0x0002,0x0005,0x000B,0x0017,0x002F,0x005F,0x00BE,0x017D,0x02FB,0x05F6,0x0BED,0x17DA,0x2FB5,0x5F6B,....
Последовательность чисел, получаемая после прерывания TIM0 в паре ZH:ZL 0x0000,0x0001,0x0003,0x007,0x000F,0x001F,0x003F,0x007F,0x00FE,0x01FC,0x03F9,0x7F3,0x0FE7,0x1FCE,0x3F9C,....
Проверял AVR STUDIO 3.2.
Исправленный вариант, в который включены команды проверки. По умолчанию проверяется отсутствие в последовательности кода 0xFFFF.