Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор случайных чисел, На микроконтроллере 
:(
    Опции темы
Alexei
Дата 11.10.2003, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 20.8.2003

Репутация: нет
Всего: 4



Надо сделать генератор случайных чисел в диапазонах 1-4, 1-6,1-8 ...1-100 на микроконтроллере.
Думаю, попробовать считывать по событию байт значения таймера , считающего клок, потом вгонять его сдвигом вправо в нужный диапазон
Но есть сомнения в равномерности распределения значений.
Может есть другие алгоритмы?
PM MAIL   Вверх
val
Дата 11.10.2003, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: 1
Всего: 7



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


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
maxim1000
Дата 11.10.2003, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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

Нужно беспокоиться не о равномерности распределения (это легко исправляется), а о независимости их
это сильно зависит от того, по какому событию считывается значение таймера
Цитата
Для таких вещей иногда используют сдвиговый регистр с обратными связями...

я бы даже сказал не иногда, а довольно часто (в своих задачах)
но для работы сдвигового регистра нужно задать начальное значение, а его желательно выбрать случайно

тут еще все зависит от назначения случайной последовательности
Если она используется для задач типа примешать к звуковому сигналу шум, чтобы он звучал поестественнее, то сойдет одинаковая при каждом запуске последовательность, которую можно сгенерировать уже на этапе разработки программы, или же можно использовать какие-нибудь стандартные алгоритмы, котрые есть в C, Pascal, ...
А вот если последовательность используется для штфрования, то, действительно, стоит взять сдвиговый регистр и хорошо подумать о его начальном заполнении (потому, что над этим также хорошо, а, скорее всего, лучше подумают взломщики)

Цитата
правда, с фиксированным периодом повторения..

ну, это - свойство любого программного генератора случайных чисел
а сдвиговые регистры, как раз менее всего подвержены ему (у них период максимален)


--------------------
qqq
PM WWW   Вверх
maxim1000
Дата 11.10.2003, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



вот, забыл написать, как исправить неравномерность, думаю, этот пример все объяснит:
пусть у нас есть генератор случайных целых чисел от 0 до 1 (случайных битов smile.gif)
и вероятность 0 - 2/3, а вероятность 1 - 1/3
построим из него генератор случайных битов с равномерным распределением
1. возьмем пару бит из первого генератора
2. если два бита одинаковы => вернемся на шаг1 и возьмем другую пару
3. если 01 => возвращаем 0, иначе возвращаем 1
или вот еще один способ (в нем мы будем брать фиксированное количество битов от первого генератора, но получим не точно равномерное распределение):
1. берем 3 бита
2. считаем количество 1
3. если количество единиц четное (вероятность=12/27) - возвращаем 1, иначе (вероятность=13/27) - 0

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

Это сообщение отредактировал(а) maxim1000 - 11.10.2003, 17:49


--------------------
qqq
PM WWW   Вверх
Alexei
Дата 12.10.2003, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 20.8.2003

Репутация: нет
Всего: 4



Цитата(maxim1000 @ 11.10.2003, 17:29)
Нужно беспокоиться не о равномерности распределения (это легко исправляется), а о независимости их
это сильно зависит от того, по какому событию считывается значение таймера


Событие, то что надо: нажимание кнопок человеком.
А вот сдвиг вправо(это деление на 2, если не ошибаюсь?) приводит к ярко выраженной неравномерности.Как по другому вгонять число в нужный предел?
PM MAIL   Вверх
maxim1000
Дата 12.10.2003, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
Как по другому вгонять число в нужный предел?

брать остаток от деления на что-нибудь
например, для 1-100 нужно взять остаток от деления на 100 и прибавить 1
Это лучше потому, что неравномерность обычно больше проявляется в старших битах, а младшие распределены более равномерно. Или можно избавиться от "ярко выраженной неравномерности" одним из вышеописанных способов


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.