![]() |
|
|
![]()
|
|
| Alexei |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 382 Регистрация: 20.8.2003 Репутация: нет Всего: 4 |
Надо сделать генератор случайных чисел в диапазонах 1-4, 1-6,1-8 ...1-100 на микроконтроллере.
Думаю, попробовать считывать по событию байт значения таймера , считающего клок, потом вгонять его сдвигом вправо в нужный диапазон Но есть сомнения в равномерности распределения значений. Может есть другие алгоритмы? |
|||
|
||||
| val |
|
|||
![]() Program developer ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 992 Регистрация: 14.1.2003 Где: г. Киев Репутация: 1 Всего: 7 |
Для таких вещей иногда используют сдвиговый регистр с обратными связями... Доказано, что такая штука может генерировать псевдослучайные числа, правда, с фиксированным периодом повторения.. Поищи статьи на эту тему...
-------------------- Терпимость - величайшее благо человечества... Ярчайший признак интеллекта – постоянно хорошее настроение… |
|||
|
||||
| maxim1000 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
Нужно беспокоиться не о равномерности распределения (это легко исправляется), а о независимости их это сильно зависит от того, по какому событию считывается значение таймера
я бы даже сказал не иногда, а довольно часто (в своих задачах) но для работы сдвигового регистра нужно задать начальное значение, а его желательно выбрать случайно тут еще все зависит от назначения случайной последовательности Если она используется для задач типа примешать к звуковому сигналу шум, чтобы он звучал поестественнее, то сойдет одинаковая при каждом запуске последовательность, которую можно сгенерировать уже на этапе разработки программы, или же можно использовать какие-нибудь стандартные алгоритмы, котрые есть в C, Pascal, ... А вот если последовательность используется для штфрования, то, действительно, стоит взять сдвиговый регистр и хорошо подумать о его начальном заполнении (потому, что над этим также хорошо, а, скорее всего, лучше подумают взломщики)
ну, это - свойство любого программного генератора случайных чисел а сдвиговые регистры, как раз менее всего подвержены ему (у них период максимален) -------------------- qqq |
||||||
|
|||||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
вот, забыл написать, как исправить неравномерность, думаю, этот пример все объяснит:
пусть у нас есть генератор случайных целых чисел от 0 до 1 (случайных битов и вероятность 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 |
|||
|
||||
| Alexei |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 382 Регистрация: 20.8.2003 Репутация: нет Всего: 4 |
Событие, то что надо: нажимание кнопок человеком. А вот сдвиг вправо(это деление на 2, если не ошибаюсь?) приводит к ярко выраженной неравномерности.Как по другому вгонять число в нужный предел? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
брать остаток от деления на что-нибудь например, для 1-100 нужно взять остаток от деления на 100 и прибавить 1 Это лучше потому, что неравномерность обычно больше проявляется в старших битах, а младшие распределены более равномерно. Или можно избавиться от "ярко выраженной неравномерности" одним из вышеописанных способов -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |