ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
1151407 Топик полностью
RxTx (05.12.2021 05:19, просмотров: 236) ответил Adept на конкретно в этой задаче, да, идеального RND не надо, но как я уже говорил, качественный RND малой кровью, работающий в широком ряду МК - весьма интересная и полезная штука. Чёб не сбацать, если есть возможность (тем более, что всё равно что-то сейчас придётся делать для проекта, вот и решил копнуть глЫбжее :))
Самые простенькие RNG'шки ты конечно же найдешь на форумах посвящнных 8-биткам. Z80, 6502, PIC, может быть и AVR. 

Вот например линейный конгруэнтный генератор.

В самой простой форме на псевдо-ассемблере выглядит так:

loop:

reg = reg * 5

reg = reg + 1 // то есть инкремент

goto loop

- в reg будет постоянно обновляемое внутри цикла случайное число


Константы здесь 5 и 1. Другие константы:

https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use


умножение на пятерку это

либо два сдвига на один бит подряд либо если вс системе команд есть, то сдвиг на два бита (т.е. * 4),

и сумма с исходным значением, т.е.:

temp_reg = reg

shift left logical reg

shift left logical reg

add reg, temp_reg


Длина генерируемой последовательности равна длине регистров.

Этот RNG (с другими константами) работает в C/C++ и бейсиках.

Но несмотря на такую распространенность, у него есть нюансы.

1. Плохой спектр.

2. Его биты статистически шумят не эквивалентно. Он генерирует рандомные ЧИСЛА (всю группу бит как целое), но не биты,

биты статистически шумят по убыванию от старших к младшим.


Надо было это?