Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить

Генератор случайных чисел.

Вт янв 01, 2008 23:44:13

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

Вт янв 01, 2008 23:53:45

самый простейший с точки зрения напряжения мозга способ: всю свободную память МК заполняешь случайными числами, которые сгенерировал, например, в Экселе в виде таблички (или вручную, кидая реальную кость :))) ). по моим прикидкам там поместится никак не меньше 4000 чисел. В основной программе просто каждые 2 секунды берешь из этого "массива" очередное число и выводишь его :) вряд ли кто сумеет предугадать последовательность из 4000 чисел.
А вот реализовать математически формулу, генерирующую псевдослучайную последовательнсоть чисел, будет посложнее, т.к. придется вспоминать математику и, может быть, даже высшую :)

Вт янв 01, 2008 23:56:52

Первый вариант мне очень понравился, но писать такую программу - рука отвалится...

Ср янв 02, 2008 00:20:04

А обязательно на МК? Можно ведь сделать генератор шума
http://www.cryogenius.com/hardware/rng/

Ср янв 02, 2008 00:31:02

Да. МК - это одно из главных требований к устройству.
ЗЫ: А на русском можно, а то в английском я полный нуль.

Ср янв 02, 2008 06:58:05

МК, МК... :o

Реализуется на всём, чём угодно. К155ЛА3, например. И не МК нужен, и не о случайных числах речь в данном случае идёт.

Смотрите такову науку: "Численные методы" называется. Алгоритмы генерации псевдослучайных чисел. Почему "псевдо"? Да потому, что мы сможем генерировать эти числа с определенным периодом и заданным распределением из-за того, что численные методы используются. 8)
Последний раз редактировалось ИРБИС Чт янв 03, 2008 21:10:56, всего редактировалось 1 раз.

Ср янв 02, 2008 07:39:01

Паятель писал(а):А обязательно на МК? Можно ведь сделать генератор шума
http://www.cryogenius.com/hardware/rng/


МЯУ какое интересное решение, жаль что аж целых 12 воль надо
а перевернутый транзистор в роли диода ?

Ср янв 02, 2008 11:26:38

А вот вам и на К155ЛА3 — в школьных кружках раньше собирали. Нажмёшь кнопку — число фиксируется.

Количество игральных костей и варианты индикации — кому какие нравятся! Здесь на ИН-ках сделано. :)
Вложения
cube.gif
(15.79 KiB) Скачиваний: 1668

Чт янв 03, 2008 13:44:54

ИРБИС писал(а):А вот вам и на К155ЛА3 — в школьных кружках раньше собирали. Нажмёшь кнопку — число фиксируется.

Разве схема только на ЛА3? А ИЕ2 и ИА1 так, посивные элементы. И я же русским языком писал, что видал я такие схемы(с кнопкой), а мне без кнопки нужно.

Чт янв 03, 2008 14:01:15

regenerator писал(а):Разве схема только на ЛА3? А ИЕ2 и ИА1 так, посивные элементы. И я же русским языком писал, что видал я такие схемы(с кнопкой), а мне без кнопки нужно.
Да. Сама схема именно на ЛА3, остальное — это индикация. И микросхема там ИД1, а не ИА1. Плохо напечатано, понимаешь? :wink: Вместо кнопки можно транзисторный ключ поставить. Управлять им можно от таймера, вам через 2 с индикацию нужно? :wink: 555 (КР1006ВИ1) или 7555 (КР1441ВИ1) прекрасно справятся с этой задачей! :) Индикацию, как я уже говорил, какую хочешь, ту и делай. :wink:

Удачи! :)

Чт янв 03, 2008 14:21:59

Если я поставлю таймер, то он будет останавливать генерацию через равные промежутки времени, и каждый раз будет выводиться одно и то же число. Человек не может с такой точностью нажимать на кнопку, поэтому кажется, что числа выдаваемые устройством - случайны.

Чт янв 03, 2008 14:31:34

Спасибо всем, кто участвовал в теме! Проблема с генератором случайных чисел разрешилась.
Сделал всё по совету ARV, а именно сам кидал кубик и записывал все варианты в микроконтроллер, пока набрал около сотни чисел, но результат - превосходный, думаю, что 4 тысячи чисел писать не буду, трёхсот вполне хватит.
Ещё раз спасибо!
Я писал(а):Первый вариант мне очень понравился, но писать такую программу - рука отвалится...

Не отвалилась. :)))
Последний раз редактировалось regenerator Чт янв 03, 2008 14:36:35, всего редактировалось 1 раз.

Чт янв 03, 2008 14:32:24

regenerator писал(а):Если я поставлю таймер, то он будет останавливать генерацию через равные промежутки времени, и каждый раз будет выводиться одно и то же число.
Частота генератора довольно большая, таймер аналоговый, так что достаточно случайно получаться должно. :) В целом замечание верное.

Есть хорошая книга, её "Библией для программистов" называли: Д.Кнут "Искусство программирования для ЭВМ". Советую прочитать. Её недавно в очередной раз переиздали, но стоит конечно... :shock: :shock: :shock: Но здесь: http://www.radiokot.ru/forum/viewtopic.php?t=466 вроде бы мелькала, хотя три тома весят... :shock: :shock: :shock:

Ср сен 17, 2008 13:25:48

regenerator да вы терпеливый человек :))
Ну хоть и поздно может кому пригодится.
Одним из простых способов как можно сгенерировать ряд псевдо случайных числел следующий:
Берем ряд чисел Фибоначчи(следующее число получается сложением двух пpедыдущих) :
13, 21, 34, 55, 89, 144, 233...
И далее берем допустим только второй знак числа и получаем ряд псевдо случайных чисел:
3,1,4,5,9,4,3...

Ср сен 17, 2008 13:53:51

Есть генератор псевдослучайных чисел у Хоровица с Хиллом.

Ср сен 17, 2008 17:11:09

буквально недавно мне пришлось самому последовать своему совету - срочно и быстро надо было сделать псевдослучайную последовательность... хотя с формулой у меня проблем нет - решил все-таки табличный способ, т.к. дополнительно было необходимо всю память, не занятую программой, заполнить "мусором". так вот, решение задачи, как говорится, в пять шагов:
1. Открываем эксель
2. вводим в рядом стоящие клетки по горизонтали следующее (квадратными скобками я обозначил клетки):
[.db] [=СЛЧИС()*255]
3. форматируем вторую клетку, чтобы в ней число было округлено до целых
4. выделяем пару этих клеток, цепляем мышкой за правый нижний угол выделения и растягиваем выделение вниз на сколько надо клеток (мне было надо на 512). получаем таблицу случайных чисел.
5. выделяем эту таблицу, копируем в буфер обмена, переключаемся в редактор программы для МК и делаем "вставить" - вуаля! таблица из 512 случайных чисел (для ассемблера) готова!!! и руки не отваливаются абсолютно!!!

для пишущих на Си алгоритм точно такой же, только сначала вводим =СЛЧИС()*255 а затем в клетку рядом - запятую. после копирования надо будет лишь перед таблицей добавить char random[] = { и после таблицы поставить закрывающую фигурную скобку. Кстати, если умножать на 65535 - можно получить случайные числа unsigned int

в общем, дешево и сердито. для экономии места в программе оформить таблицу можно в виде include-файла

Ср сен 17, 2008 17:55:09

Вообщето, норманьные генераторы случайных чисел (не псевдо) делаются так. Берётся шумящий элемент -резистор, транзистор, стабилитрон. Сигнал усиливается и подается на компаратор.
Дальше, в течении некоторго большого интервала времени, считают количество импульсов и если количество четное - полагают что получен бит-0, а если нечётное - полагают что получен бит-1.
Получается настоящая случайная битовая последовательность, которую можно нарезать на числа, по n-бит :)))
Можно сигнал с шумящего стабилитрона усилить и подать на АЦП, откинуть старшие разряды, а мадшие будут представлять из себя неплохой цифровой шум! :)))

Ср сен 17, 2008 18:29:49

Здравствуйте. Может кому пригодится в случае, когда нужно экономить память программ. Собственно генератор псевдослучайной последовательности находится в обработчике прерывания TIM0.

Ср сен 17, 2008 19:06:06

akl, вы бы хоть пояснили, в каких регистрах у вас само число получается... я вот взял и протестировал в студии - нифига не псевдослучаное там получается... ессли вначале все регистры обнулены - вообще так они и остаются, а если в ZL не ноль - что-то получается в ZH:ZL, но на случайное похоже мало... во всяком случае при начальном значении ZL=2 получается последовательность чисел больше 255 однозначно - т.е. явно не очень случайное распределение...

и вообще, алгоритм какой-то странный у вас...

Чт сен 18, 2008 17:12:47

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.
Ответить