реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Генератор случайных чисел.
Stanislav_S
сообщение Jul 21 2007, 13:34
Сообщение #1


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Потребовалось тут реализовать ГСЧ на AVR. Интересует каков алгоритм реализации, числа должны лежать в диапазоне 0 - 9. В детстве делал такую штуку на МК61 smile.gif, но к сожалению как это делать в памяти совершенно не отложилось smile.gif


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
SIA
сообщение Jul 21 2007, 22:24
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Stanislav_S @ Jul 21 2007, 17:34) *
Потребовалось тут реализовать ГСЧ на AVR. Интересует каков алгоритм реализации, числа должны лежать в диапазоне 0 - 9. В детстве делал такую штуку на МК61 smile.gif, но к сожалению как это делать в памяти совершенно не отложилось smile.gif

При таком диапазоне - всего 10 значений - погрешность от дискретности может сравняться с погрешностью от периодичности уже при длине таблицы в 100-200 чисел. Тогда проще всего зашить табличку (50-100 байт всего). Если генерить - то либо ПСП, либо линейный конгруэнтный метод (правда, там множить надо).
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Jul 22 2007, 08:32
Сообщение #3


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(SIA @ Jul 22 2007, 03:24) *
При таком диапазоне - всего 10 значений - погрешность от дискретности может сравняться с погрешностью от периодичности уже при длине таблицы в 100-200 чисел. Тогда проще всего зашить табличку (50-100 байт всего). Если генерить - то либо ПСП, либо линейный конгруэнтный метод (правда, там множить надо).

А можно подробнее о этих методах, или хотя бы какие ключевые слова для поиска?


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
SIA
сообщение Jul 22 2007, 13:43
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Stanislav_S @ Jul 22 2007, 12:32) *
А можно подробнее о этих методах, или хотя бы какие ключевые слова для поиска?

Таблица - тут, думаю, все очевидно.
ПСП - это регистр сдвига с обратной связью, формирующий псевдослучайную последовательность максимальной длины (для твоей задачи за глаза хватит длины 15 бит). Делается его программная модель, и выбираются 4 бита из него. Единственная проблема - он двоичный, а тебе нужен диапазон 0...9, придется отбрасывать числа 10-15. При получении следующего числа для уничтожения явной корреляции нужно "прокручивать" регистр не менее, чем на его длину, например, на 16 циклов.
Линейный конгруэнтный метод - берем начальное число, следующие генерим из него:
x[n+1] = (a*x[n]+ c) mod M, a, c, М - константы. для M = степень двойки , ПСЧ имеет максимальную длину M, когда C - нечётное, а A mod 4 = 1.

Вот простая подборка по теме
http://www.uni-vologda.ac.ru/students/pm02...eudorandom.html
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Jul 22 2007, 14:04
Сообщение #5


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(SIA @ Jul 22 2007, 18:43) *
Таблица - тут, думаю, все очевидно.
ПСП - это регистр сдвига с обратной связью, формирующий псевдослучайную последовательность максимальной длины (для твоей задачи за глаза хватит длины 15 бит). Делается его программная модель, и выбираются 4 бита из него. Единственная проблема - он двоичный, а тебе нужен диапазон 0...9, придется отбрасывать числа 10-15. При получении следующего числа для уничтожения явной корреляции нужно "прокручивать" регистр не менее, чем на его длину, например, на 16 циклов.
Линейный конгруэнтный метод - берем начальное число, следующие генерим из него:
x[n+1] = (a*x[n]+ c) mod M, a, c, М - константы. для M = степень двойки , ПСЧ имеет максимальную длину M, когда C - нечётное, а A mod 4 = 1.

Вот простая подборка по теме
http://www.uni-vologda.ac.ru/students/pm02...eudorandom.html

ОК! Спасибо, буду думать.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Alex255
сообщение Jul 23 2007, 05:24
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 450
Регистрация: 21-12-06
Пользователь №: 23 757



Цитата(SIA @ Jul 22 2007, 02:24) *
При таком диапазоне - всего 10 значений - погрешность от дискретности может сравняться с погрешностью от периодичности уже при длине таблицы в 100-200 чисел. Тогда проще всего зашить табличку (50-100 байт всего). Если генерить - то либо ПСП, либо линейный конгруэнтный метод (правда, там множить надо).

А что такое в данном случае погрешность от дискретности? 07.gif
Go to the top of the page
 
+Quote Post
SIA
сообщение Jul 23 2007, 08:39
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(Alex255 @ Jul 23 2007, 09:24) *
А что такое в данном случае погрешность от дискретности? 07.gif

То, что распределение не непрерывное, а всего 10 дискретных значений - 0...9, к примеру, 4,5 не будет никогда.
Go to the top of the page
 
+Quote Post
-=ВН=-
сообщение Jul 23 2007, 08:56
Сообщение #8


Местный
***

Группа: Новичок
Сообщений: 210
Регистрация: 3-11-06
Пользователь №: 21 936



Цитата(SIA @ Jul 23 2007, 12:39) *
То, что распределение не непрерывное, а всего 10 дискретных значений - 0...9, к примеру, 4,5 не будет никогда.

А дискретные случайные величины Вы считаете неправильными? biggrin.gif
Go to the top of the page
 
+Quote Post
Alex255
сообщение Jul 23 2007, 09:35
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 450
Регистрация: 21-12-06
Пользователь №: 23 757



Цитата(-=ВН=- @ Jul 23 2007, 12:56) *
А дискретные случайные величины Вы считаете неправильными? biggrin.gif

Ну да, это типа "Бросаем игральную кость. Погрешность выпавшего числа N составляет..." smile.gif
Go to the top of the page
 
+Quote Post
SIA
сообщение Jul 23 2007, 15:20
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(-=ВН=- @ Jul 23 2007, 12:56) *
А дискретные случайные величины Вы считаете неправильными? biggrin.gif

Да "правильные" они smile.gif, просто при числе состояний N для устаканивания статистики (первой пары моментов - среднего и СКО) достаточно длины выборки порядка N^2. Проще говоря, повторяющаяся таблица длиной порядка N^2 во многих (но, конечно, не всех) задачах будет сравнима с истинно случайными числами. N здесь маленькое, таблица получается короткой. А короткую таблицу шебуршить проще простого, особенно если счетчик модулярный, места займет меньше, чем программный генератор. Я потому и дал несколько вариантов и ссылку - пусть сами выбирают, что лучше подойдет.

Сообщение отредактировал SIA - Jul 23 2007, 15:26
Go to the top of the page
 
+Quote Post
-=ВН=-
сообщение Jul 24 2007, 04:58
Сообщение #11


Местный
***

Группа: Новичок
Сообщений: 210
Регистрация: 3-11-06
Пользователь №: 21 936



Цитата(SIA @ Jul 23 2007, 19:20) *
Да "правильные" они smile.gif, просто при числе состояний N для устаканивания статистики (первой пары моментов - среднего и СКО) достаточно длины выборки порядка N^2. Проще говоря, повторяющаяся таблица длиной порядка N^2 во многих (но, конечно, не всех) задачах будет сравнима с истинно случайными числами. N здесь маленькое, таблица получается короткой. А короткую таблицу шебуршить проще простого, особенно если счетчик модулярный, места займет меньше, чем программный генератор. Я потому и дал несколько вариантов и ссылку - пусть сами выбирают, что лучше подойдет.

Ну первую пару моментов, хотя СКО вовсе не момент а корень из него, с очень большой натяжкой можно считать критерием близости экспериментальной ф-ии распределения выборки к некой желаемой. С очень большой натяжкой. smile.gif И даже их устаканивание. Иначе всех, жаждущих случайности, спас бы генератор синуса с подставкой.
Сравнимость таблицы размером порядка N^2 с истинно случайными числами тоже вызывает смутные сомнения . Т.е. критерий сравнимости хотелось бы. smile.gif
И простой пример.
Возьмите всего 2 равновероятных состояния (N=2) , 1 и -1. Вероятность каждого 0.5. Легко посчитать, что вероятность 2-х подряд идуших 1, или -1, равна 0.25. 3-х подряд - 0.125, 4-х подряд - 0.0625. Не такие уж и малые вероятности. У меня вызывает большие сомнения, что таблица из 4 элементов способна обеспечить появление хотя бы всех вышеперечисленных комбинаций с нужными вероятностями. smile.gif
Go to the top of the page
 
+Quote Post
SIA
сообщение Jul 24 2007, 06:05
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 462
Регистрация: 26-06-07
Пользователь №: 28 723



Цитата(-=ВН=- @ Jul 24 2007, 08:58) *
Ну первую пару моментов, хотя СКО вовсе не момент а корень из него, с очень большой натяжкой можно считать критерием близости экспериментальной ф-ии распределения выборки к некой желаемой. С очень большой натяжкой. smile.gif И даже их устаканивание. Иначе всех, жаждущих случайности, спас бы генератор синуса с подставкой.
Сравнимость таблицы размером порядка N^2 с истинно случайными числами тоже вызывает смутные сомнения . Т.е. критерий сравнимости хотелось бы. smile.gif
И простой пример.
Возьмите всего 2 равновероятных состояния (N=2) , 1 и -1. Вероятность каждого 0.5. Легко посчитать, что вероятность 2-х подряд идуших 1, или -1, равна 0.25. 3-х подряд - 0.125, 4-х подряд - 0.0625. Не такие уж и малые вероятности. У меня вызывает большие сомнения, что таблица из 4 элементов способна обеспечить появление хотя бы всех вышеперечисленных комбинаций с нужными вероятностями. smile.gif

1. Универсального критерия на ВСЕ случаи жизни нет и быть не может. Но простейший пример, где таких "случайных" чисел (конечно, при достаточно большом N) вполне хватает - приближенное вычисление площади фигуры методом Улама/Монте-Карло. И таблицы случайных чисел в том числе и для этого в свое время и печатали, кстати, объем их редко достигал N^2. Естественно, этот способ годится не для всех задач, о чем я и предупреждал. Решать-то не мне, а тому, кто спрашивал. Мое дело - предложить варианты, пусть выбирают.
2. Вы рассматриваете вырожденный (особый) случай - всего 2 состояния, типа бинарного потока. Однако жесткие требования к статистике в таких случаях встречаются в основном при формировании длиннобазовых сигналов, когда важны требования к корелляционным свойствам (о чем исходно речи не было). В случае длиннобазового сигнала таблица длиной менее длины базы некорректна, к тому же для бинарной последовательности часто проще сделать ПСП на регистре. В то же время при увеличении числа состояний вероятности конкретных цепочек событий резко падают, и то, что далеко не все из них будут в таблице, а у оставшихся вероятность повышена, во многих случаях перестает иметь практическое значение. Конкретный пример - таблица порядка N^2 даст большинство двойных сочетаний, но (по порядку величины) только 1/N от общего числа тройных, завышая вероятность представленных в таблице с ~N^-3 до ~N^-2. Однако во вполне типовой задаче типа рандомизации ошибки округления это не имеет никакого практического значения.
3. Генератор синуса с подставкой - слишком сложен в вычислительном отношении, и распределение у него дальше от равномерного, чем у тупого генератора пилы на счетчике. Собственно, линейный конгруэнтный метод - это и есть сильно модифицированный модулярной арифметикой генератор пилы smile.gif.
4. Напоследок замечу, что для такой безусловно практической задачи, как "случайный" выбор этажа, на котором должен отдыхать лифт, вся вышеизложенная теория заведомо избыточна smile.gif
5. Больше писать просто лень. Не вижу смысла. Кому охота цепляться к мелочам - тратьте время сами, мне работать надо.
Go to the top of the page
 
+Quote Post
-=ВН=-
сообщение Jul 24 2007, 06:28
Сообщение #13


Местный
***

Группа: Новичок
Сообщений: 210
Регистрация: 3-11-06
Пользователь №: 21 936



Цитата(SIA @ Jul 24 2007, 10:05) *
1. Универсального критерия на ВСЕ случаи жизни нет и быть не может. Но простейший пример, где таких "случайных" чисел (конечно, при достаточно большом N) вполне хватает - приближенное вычисление площади фигуры методом Улама/Монте-Карло. И таблицы случайных чисел в том числе и для этого в свое время и печатали, кстати, объем их редко достигал N^2. Естественно, этот способ годится не для всех задач, о чем я и предупреждал. Решать-то не мне, а тому, кто спрашивал. Мое дело - предложить варианты, пусть выбирают.
2. Вы рассматриваете вырожденный (особый) случай - всего 2 состояния, типа бинарного потока. Однако жесткие требования к статистике в таких случаях встречаются в основном при формировании длиннобазовых сигналов, когда важны требования к корелляционным свойствам (о чем исходно речи не было). В случае длиннобазового сигнала таблица длиной менее длины базы некорректна, к тому же для бинарной последовательности часто проще сделать ПСП на регистре. В то же время при увеличении числа состояний вероятности конкретных цепочек событий резко падают, и то, что далеко не все из них будут в таблице, а у оставшихся вероятность повышена, во многих случаях перестает иметь практическое значение. Конкретный пример - таблица порядка N^2 даст большинство двойных сочетаний, но (по порядку величины) только 1/N от общего числа тройных, завышая вероятность представленных в таблице с ~N^-3 до ~N^-2. Однако во вполне типовой задаче типа рандомизации ошибки округления это не имеет никакого практического значения.
3. Генератор синуса с подставкой - слишком сложен в вычислительном отношении, и распределение у него дальше от равномерного, чем у тупого генератора пилы на счетчике. Собственно, линейный конгруэнтный метод - это и есть сильно модифицированный модулярной арифметикой генератор пилы smile.gif.
4. Напоследок замечу, что для такой безусловно практической задачи, как "случайный" выбор этажа, на котором должен отдыхать лифт, вся вышеизложенная теория заведомо избыточна smile.gif
5. Больше писать просто лень. Не вижу смысла. Кому охота цепляться к мелочам - тратьте время сами, мне работать надо.

1. Так у Вас никакого не было критерия вообще, кроме матожидания и дисперсии, которые критерием случайности не являются. smile.gif
2. На вырожденном все виднее smile.gif
3. Генератор синуса с подставкой прекрасно заменяет случ. величину, и даже случайный процесс, с любым распределением, если критерием близости распределений считать матожидание и дисперсию smile.gif
К тому же он является сильномодифицированным генератром пилы. И этим особенно близок к линейному конгруэнтному методу. biggrin.gif
4. Все может быть.
5. Да ради бога, работайте. Если бы Вы не притянули некую наукообразность, а просто предложили бы генератор ПСП, лин. конгруэнтныйд, Парка-Миллера, ктороый правда тоже можно считать конгруэнтным, только вырожденным, еще чего- нибудь, я бы и словап не сказал. biggrin.gif
Go to the top of the page
 
+Quote Post
alexQ
сообщение Jul 31 2007, 08:40
Сообщение #14


Знающий
****

Группа: Banned
Сообщений: 520
Регистрация: 6-02-06
Пользователь №: 14 040



А может быть все проще?
я делаю так:

// функция rnd(x) вернет числа между 1 и заданым максимумом x.
// rnd(10) вернет числа между 1 и 10, rnd(50) вернет числа между 1 и 50
int rnd( int max )
{
return (rand() % max) + 1;
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 01:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016