Программу (сурсы?) для тестов в студию.
Вид для печати
Программу (сурсы?) для тестов в студию.
Я тоже так проверяю)))
Делал когда-то свой генератор случайных чисел на Амиге (для эмулятора Денди, шумового канала), и тоже так на экране его проверял. Менял алгоритм, пока распределение на экране не стало выглядеть случайным. Вот этот амижный код в Сишном эквиваленте:
Код:UINT8 FastRND(void)
{
static UINT16 D2 = 42286,
D1 = 65535,
A1 = 30609,
D3;
D3 = D1 + A1;
A1 = D1 ^ 0xFFFF;
D1 = (D2 >> 5) | (D2 << 11);
D2 = D2 + D3;
return D2;
}
Я не уверен, что ram_scan так проверяет. Вот и уточняю.
RND-генератор с ОЧЕНЬ большим периодом:
http://zxpress.ru/article.php?id=8675Код:II. Основанный на LFSR
генератор случайных байт
Как написано в умных книжках [4], один
из таких генераторов придуман Mitchell'ом
и Moore'ом и имеет вид:
X[n] = ( X[n-24] + X[n-55] ) mod m
Если m=2^k, то период такого генератора
(2^55-1)·2^(k-1), что для случая байтов
составит 2^(55-1)·2^7 ў 2^62 ў 4.6·10^18.
Можно заметить, что для младшего бита
такой генератор представляет собой LFSR-
генератор (в данном случае N=55, K=24 ).
Можно было бы вместо сложения использовать
операцию XOR, в этом случае мы имели бы 8
55-битовых LFSR, генерирующих различные
фазы последовательности длиной 2^55-1 бит
и комбинируемые в 1 байт. Вместо LFSR с
параметрами N=55, K=24 можно использовать
любой другой с последовательностью макси─
мальной длины.
Реализация на Z80 (с таблицей 256 байт):
DO_RND
;OUT: A или B или C - случайный байт
LD H,'PRT_RND ; 256-байтовая
;таблица
CURND LD A,0
INC A
LD (CURND+1),A ; не случайный
;номер, а лишь
;указатель в таблице
LD L,A
LD B,(HL)
ADD A,55-24
LD L,A
LD C,(HL)
ADD A,24
LD L,A
LD A,B
ADD A,C
LD (HL),A
;в регистрах A, B и С находятся случайные
;величины, отстоящие друг от друга на
;несколько десятков отсчётов
RET
Перед использованием такого генератора
следует записать хотя бы 1 ненулевой байт
в таблицу PRT_RND, а чтобы случайные числа
получались хорошими сразу - лучше запол─
нить таблицу каким-нибудь данными с более-
менее равномерным распределением всех
байт.
Для сдвигового 16-битного регистра с обратной связью такой полином только один, который я и использовал. Можно конечно генератор перекодить, если с неочевидным битовым трюкачеством быстро суметь четность посчитать (под четностью понимается четное/нечетное количество единичных битов в слове). Я литературу проштудировал на этот счет, но мне показалось все-таки в лоб проще сделать, не хватает "аккумуляторов" на Z80 для того чтобы изящно сделать. На писюке четность с битовыми трюками считается быстро и изящно. Но там и классический генератор любой разрядности с делением закодить несложно, либо сопроцессор за вымя потрогать.
Для 32 бит есть других полиномов, они собсно все в литературе описаны.
http://www.worldofspectrum.org/forum...ad.php?t=39632
и там же еще ссылка. У поляков тоже тема есть давно, и с примерами..
Вот тут лежат коэффициенты всех 2048 возможных линейных сдвиговых генераторов с полным периодом: http://www.ece.cmu.edu/~koopman/lfsr/index.html
Не все они могут оказаться "хорошими", потому что степень "замешивания" битов не проверяется. Тем не менее, наверняка, в этом списке найдутся достойные альтернативы вашему варианту.
А если построить огибающий колокол?
http://www.cognitivist.ru/kernel/pro...rologi_388.png