Как сделать блуждание? Натолкните на мысль. Чтобы был выбор вправо или влево на ассемблере. А то в си просто используя random а вот в асме не могу придумать
setar писал(а):как раз на робоклубе рандом в си реализован, а вот как это сделать в асм я так и не придумал.
Один из таймеров-счётчиков задействовать, настроить на какую-нить частоту, асинхронно считывать значение, это значение использовать как адрес для выборки байта из памяти програм, и пообъеденять полученые 3 байта напр. через XOR или просумировав без учёта переноса меж собой, и предыдущим значением - получим псевдослучайное число размером в байт. Такое делал довольно давно ещё на Спектруме - довольно неплохо работало, и последовательность повторялась довольно нескоро. Можно наварганить и посложнее алгоритм - повторяться будет ещё реже. Можно и без таймера-счётчика обойтись, но тогда начало последовательности будет заранее извесно: задаёться какой-то регистр как указатель на последовательность, из ячейки, на которую он указывает в памяти програм считываеться число, указатель инкрементируем и прибавляем это число - это новый указатель, побайтная сумма указателя с этим числом и будет значением (можно ещё и с XOR побаловаться).
Униформным генератором случайных чисел называется формула:
RND[n+1]=(RND[n]*A+B) mod C.
Если вы не пишете систему криптографической защиты - вам врядли нужно что-то большее. А если все-таки пишете - покупайте аппаратный генератор случайных чисел.
aliens писал(а):RND[n]-это переменная или константа? числа А и В надо изменять? Результат надо писать в RND[n+1]
Извините за тупые вопросы
A, B и P - предопределенные константы
RND[n] - предыдущее значение, RND[n-1] - следующее значение псевдослучайной последовательности.
Т.е. пусть у вас есть глобальная переменная "lastRND", тогда функция получения следующего псевдослучайного числа, при A=56, B=683 и P=32459, будет такая: