|
Генератор псевдослучайных чисел |
|
|
|
Sep 8 2006, 14:28
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Нужен генератор 9 битных псевдослучайных чисел, с периодом повторения 2 в 24 или около того. Я так понимаю, что нужен 24 битный сдвиговый регистр с обратными связями и можно просто брать 9 бит с его разрядов. Или все сложнее ? Книжки у меня есть, но, честно говоря некогда разбираться, поскольку вопрос одноразовый. С каких разрядов нужно брать обратную связь для получения правильного цикла ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 8 2006, 15:16
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765

|
Цитата(DS_ @ Sep 8 2006, 18:28)  Нужен генератор 9 битных псевдослучайных чисел, с периодом повторения 2 в 24 или около того. Я так понимаю, что нужен 24 битный сдвиговый регистр с обратными связями и можно просто брать 9 бит с его разрядов. Или все сложнее ? Книжки у меня есть, но, честно говоря некогда разбираться, поскольку вопрос одноразовый. С каких разрядов нужно брать обратную связь для получения правильного цикла ? Долго пользуюсь 32-разрядным генератором с полиномом 0x4004000f. Алгоритм таков: Xn+1=Xn<<1 IF ( Xn+1<0 ) Xn+1=Xn+1 XOR 0x4004000F Особенно приятно, что в этом генераторе цепочка бит любой длины - случайна. Я брал и 2 раза по 16, и 3 раза по 10 для экономии вычислений.
|
|
|
|
|
Sep 8 2006, 20:59
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825

|
Цитата(DS_ @ Sep 8 2006, 19:25)  Цитата(bve @ Sep 8 2006, 19:16) 
IF ( Xn+1<0 )
Я вот этого не понял - XOR делается, только если старший бит ==1 ? Это зачем ? По определению сдвигового регистра с линейными обратными связями (в форме Галуа). Для указанного полинома (X**32+X**30+X**26+X**3+X**2+X**1+1) старший бит регистра "XOR-ится в разряды" 0,1,2,3,26 и 30: X[0] <= X[31] X[1] <= X[31]^X[0] X[2] <= X[31]^X[1] X[3] <= X[31]^X[2] X[4] <= X[3] X[5] <= X[4] ... X[25] <= X[24] X[26] <= X[31]^X[25] X[27] <= X[26] ... X[29] <= X[28] X[30] <= X[31]^X[29] X[31] <= X[30] Если просто брать 9 бит с разных разрядов, то будут встречаться "не совсем случайные" подпоследовательности. Например, для 9-ти старших бит 24-х разрядного регистра в какой-то момент будет такая последовательность: 01: 000000000 02: 000000000 ... 14: 000000000 15: 000000000 16: 000000001 17: 000000010 ... 23: 010000000 24: 100000000
|
|
|
|
|
Sep 9 2006, 13:04
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825

|
Цитата(DS_ @ Sep 9 2006, 01:09)  Мне собственно полином был нужен под 32 разряда. Если делать в железке, то достаточно с указанных разрядов все просуммировать (XOR) и завести на 0 разряд, а код формировать 9 -ти кратным выполением сдвига , так ? Почти достаточно. Еще надо перевернуть их порядок, иначе рискуите не получить последовательность максимальной длины. Вообще говоря, есть две формы построения LFSR: - в форме Фибоначи, это когда с указанных разрядов все просуммировать (XOR) и заводится на 0 разряд - в форме Галуа, это когда старший разряд суммируется в указанные разряды (как в примере bve). Для полинома 0x4004000f имеем: - "в указанные разряды" для Галуа: (32), 30, 26,3,2,1,0 - "с указанных разрядов" для Фибоначи: 32,31,30,29,6,2, (0) Для обоих форм длина последовательности будет одинаковой и даже это общий случай) последовательность бит со старшего (а может быть и для любого) разряда с точностью до фазы у обоих форм будет одинаковая. Однако последовательность состояний регистров в целом для разных форм будут разные. Если интересно, могу предложить небольшую статью: http://www.newwaveinstruments.com/resource...ter_lfsr.htmТам есть примеры других коэффициентов для различных длин регистров. Кстати, если для 32-разрядного регистра формировать 9-ти разрядный код 9-ти кратным сдвигом, то длина последовательности будет 1431655765, что намного больше, чем 2**24  .
Сообщение отредактировал vladv - Sep 9 2006, 13:06
|
|
|
|
|
Sep 9 2006, 13:37
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825

|
Цитата(vladv @ Sep 9 2006, 17:04)  Цитата(DS_ @ Sep 9 2006, 01:09)  Мне собственно полином был нужен под 32 разряда. Если делать в железке, то достаточно с указанных разрядов все просуммировать (XOR) и завести на 0 разряд, а код формировать 9 -ти кратным выполением сдвига , так ?
Почти достаточно. Еще надо перевернуть их порядок, иначе рискуите не получить последовательность максимальной длины. Был неправ. Можно и не переворачивать. В этом случае последовательность также будет максимальной длины, но иметь обратный порядок (на отдельном бите).
Сообщение отредактировал vladv - Sep 9 2006, 13:40
|
|
|
|
|
Sep 9 2006, 14:52
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Спасибо за ссылку ! Таблица полиномов - то, что нужно. Про поля Галуа я, видимо, все-таки почитаю, надо только выбрать пару дней спокойных, чтобы подумать. Заинтересовала связь неприводимых полиномов и регистров сдвига  Да, что-то приведенного полинома нет в таблице - ошибка в полиноме или он из секретных ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 14 2006, 18:02
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Энергия в пике не превышает 10-20% энергии шума в полосе пропускания, поэтому мне важно просто чтобы длина цикла была большой, чтобы не перегнать этот пик в низкие частоты, где у меня шум маленький, а усиление большое. А то, что будет слегка неравномерный спектр, мне не важно - я пик размажу на ширину, вдесятеро большую полосы пропускания, он в белом шуме утонет.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|