roboforum.ru

Технический форум по робототехнике.

Простой автомат

Простой автомат

aliens » 09 фев 2005, 03:54

Как сделать блуждание?
Натолкните на мысль. Чтобы был выбор вправо или влево на ассемблере.
А то в си просто используя random а вот в асме не могу придумать

=DeaD= » 09 фев 2005, 08:30

На робоклубе был проект, на основе случайных чисел, вот ссылка:
http://projects.roboclub.ru/index.shtml?attempt
Смотреть раздел "таблица вероятностей переходов".

=DeaD= » 09 фев 2005, 08:31

А случайные числа всегда, если особо не париться, подменяли формулой:

Rand = (Counter*K + N) mod P

setar » 09 фев 2005, 11:55

как раз на робоклубе рандом в си реализован,
а вот как это сделать в асм я так и не придумал.

Outcaster » 09 фев 2005, 15:39

setar писал(а):как раз на робоклубе рандом в си реализован,
а вот как это сделать в асм я так и не придумал.
Один из таймеров-счётчиков задействовать, настроить на какую-нить частоту, асинхронно считывать значение, это значение использовать как адрес для выборки байта из памяти програм, и пообъеденять полученые 3 байта напр. через XOR или просумировав без учёта переноса меж собой, и предыдущим значением - получим псевдослучайное число размером в байт. Такое делал довольно давно ещё на Спектруме - довольно неплохо работало, и последовательность повторялась довольно нескоро. Можно наварганить и посложнее алгоритм - повторяться будет ещё реже.
Можно и без таймера-счётчика обойтись, но тогда начало последовательности будет заранее извесно: задаёться какой-то регистр как указатель на последовательность, из ячейки, на которую он указывает в памяти програм считываеться число, указатель инкрементируем и прибавляем это число - это новый указатель, побайтная сумма указателя с этим числом и будет значением (можно ещё и с XOR побаловаться).

=DeaD= » 09 фев 2005, 15:57

Блин, чуть ошибся. Короче так:

Униформным генератором случайных чисел называется формула:

RND[n+1]=(RND[n]*A+B) mod C.

Если вы не пишете систему криптографической защиты - вам врядли нужно что-то большее. А если все-таки пишете - покупайте аппаратный генератор случайных чисел.

aliens » 09 фев 2005, 20:27

2 Outcaster

Вот завернул. Я же просил простой(т.к. выборки из памяти не сделаю-не умею)

2 Dead

RND[n]-это переменная или константа?
числа А и В надо изменять?
Результат надо писать в RND[n+1]

Извините за тупые вопросы :)

=DeaD= » 09 фев 2005, 20:43

aliens писал(а):RND[n]-это переменная или константа?
числа А и В надо изменять?
Результат надо писать в RND[n+1]

Извините за тупые вопросы :)


A, B и P - предопределенные константы

RND[n] - предыдущее значение,
RND[n-1] - следующее значение псевдослучайной последовательности.

Т.е. пусть у вас есть глобальная переменная "lastRND", тогда функция получения следующего псевдослучайного числа, при A=56, B=683 и P=32459, будет такая:

void nextRND(){
 lastRND=(lastRND*56+683) % 32459;
 return lastRND;
};

setar » 09 фев 2005, 20:53

=DeaD=
вопрос то про ASM был, а та по привычке на си пример приводишь ...

=DeaD= » 09 фев 2005, 21:08

setar писал(а):=DeaD=
вопрос то про ASM был, а та по привычке на си пример приводишь ...

Ну не знаю я АСМ на АВР :) чем богаты тем и делимся :)

Floksa » 09 фев 2005, 23:12

=DeaD= писал(а):покупайте аппаратный генератор случайных чисел.
Самое простое решение.

aliens » 10 фев 2005, 12:55

Спасибо Dead
Седня попробую на асме

А что, кроме rand и таблице вероятностей идей нет?

Кстати а как сделать именно таблицу? как в проекте робоклуба?

setar » 10 фев 2005, 13:13

на асме таблица задаётся стандартным образом так :
Код: Выделить всёРазвернуть
table1: 
  .db 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0xFF

А обращение к элементам идёт по смещению отросительно адреса начала таблицы.

В робоклубе в таблицу забит граф переходов автомата, это самый рациональный путь.

aliens » 10 фев 2005, 14:25

Вот попробовал реализовать формулу и сразу же
попал в тупик, в ассемблере нету деления :(
Что делать дальше не представляю.

По смещению это типа 1<<4 или как?

=DeaD= » 10 фев 2005, 14:35

А вы примите за P степень двойки равную пределу переменной, и тогда у вас переполнение будет вместо "% P" само работать - никаких лишних действий :)

Просто надо тогда будет чтобы A и B не делились на 2 :)


Rambler\'s Top100 Mail.ru counter