Вот очень быстрый генератор ПСЧ на основе LSFR по схеме Галуа:Всего 66 тактов. С любым из перечисленных значений константы обратной связи, этот генератор даёт период в 65535 значений. Внимание: использовать 0 в качестве затравочной константы нельзя.Код:Galois16: ld hl, #FFFF ; 10 SeedValue: EQU $-2 add hl, hl ; 11 sbc a ; 4 and #BD ; 7 instead of #BD, one can use #2D, #39, #3F, #53 or #D7 xor l ; 4 ld l, a ; 4 ld (SeedValue), hl ; 16 ret ; 10
"introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.
LFSR дает хорошие случайные биты, но вот использовать все биты состояния в качестве 8- или 16-разрядных случайных чисел не рекомендуется: они все-таки довольно сильно коррелируют между соседними раундами работы генератора.
Любопытно, что несложной модификацией алгоритма можно заставить его "перескакивать" сразу на несколько бит, как будто подпрограмма была вызвана несколько раз. Если перескакивать каждый раз на 8 бит - то 8 из 16 разрядов такого генератора уже гораздо лучше подойдут в качестве 8-битных случайных чисел. Эта технология называется "Leap-ahead LFSR", можно погуглить и сразу найти описание.
Последний раз редактировалось Barmaley_m; 06.04.2014 в 21:20.
Это понятно. Кстати, с учётом скорости работы этого генератора, есть потенциал замесить биты, чтобы получался более-менее приличный "случайный" байт. Вот вариант на 30 тактов:Пока что генератор Baze мне всё ещё нравится больше, но он работает 136 тактов, т.е. запас есть.Код:add h ; 4 and %10101010 ; 7 ld h, a ; 4 ld a, l ; 4 and %01010101 ; 7 or h ; 4
"introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.
Я думаю, что вот это - самый быстрый генератор байтов "индустриального" качества:Этот генератор был написан Патриком Раком (Patrik Rak) и опубликован на WoS в 2008 году. Процитированный выше код был слегка дооптимизирован Einar Saukas. Он выдаёт новый псевдослучайный байт за 122 тактa процессора.Код:rnd ld hl,0xA280 ; yw -> zt ld de,0xC0DE ; xz -> yw ld (rnd+4),hl ; x = y, z = w ld a,l ; w = w ^ ( w << 3 ) add a,a add a,a add a,a xor l ld l,a ld a,d ; t = x ^ (x << 1) add a,a xor d ld h,a rra ; t = t ^ (t >> 1) ^ w xor h xor l ld h,e ; y = z ld l,a ; w = t ld (rnd+1),hl ret
Если скорость не критична, я бы рекомендовал использование именно этого генератора; он быстрее многих генераторов в этом треде, не требует большого буфера, а математически - намного, намного совершеннее LSFR.
Последний раз редактировалось introspec; 07.04.2014 в 15:41. Причина: нашёл слегка более быструю версию
"introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.
Алгоритм называется Xor-Shift, вот ссылка на статью, описывающую идеологию таких генераторов: http://www.jstatsoft.org/v08/i14/paper
Партику пришлось заново пересчитать константы генератора, т.к. в статье основной упор на тройки 32-х битных слов, а Патрик переделал алгоритм для четвёрки восьмибитных, для удобства реализации на Z80.
"introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.
Ну, во первых если я что-либо в чем-либо понимаю то сверьху не M-генератор.
Во вторых зачем его учить ? Дональд Кнут всех в 50-е годы научил обобщив высшую математику для MIX машины. С той поры собсно ничего нового не придумали пока еще.
Достаточно открыть книжку и прочитать, не изобретая велосипеда. Я прочитал.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)