roboforum.ru

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

 

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

Автомат, адаптивный автомат ... разум

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

Сообщение aliens » 09 фев 2005, 03:54

Как сделать блуждание?
Натолкните на мысль. Чтобы был выбор вправо или влево на ассемблере.
А то в си просто используя random а вот в асме не могу придумать
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение =DeaD= » 09 фев 2005, 08:30

На робоклубе был проект, на основе случайных чисел, вот ссылка:
http://projects.roboclub.ru/index.shtml?attempt
Смотреть раздел "таблица вероятностей переходов".
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение =DeaD= » 09 фев 2005, 08:31

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

Rand = (Counter*K + N) mod P
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение setar » 09 фев 2005, 11:55

как раз на робоклубе рандом в си реализован,
а вот как это сделать в асм я так и не придумал.
Аватара пользователя
setar
Site Admin
 
Сообщения: 9260
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение Outcaster » 09 фев 2005, 15:39

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

Сообщение =DeaD= » 09 фев 2005, 15:57

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

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

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

Если вы не пишете систему криптографической защиты - вам врядли нужно что-то большее. А если все-таки пишете - покупайте аппаратный генератор случайных чисел.
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение aliens » 09 фев 2005, 20:27

2 Outcaster

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

2 Dead

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

Извините за тупые вопросы :)
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение =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;
};
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение setar » 09 фев 2005, 20:53

=DeaD=
вопрос то про ASM был, а та по привычке на си пример приводишь ...
Аватара пользователя
setar
Site Admin
 
Сообщения: 9260
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение =DeaD= » 09 фев 2005, 21:08

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

Ну не знаю я АСМ на АВР :) чем богаты тем и делимся :)
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение Floksa » 09 фев 2005, 23:12

=DeaD= писал(а):покупайте аппаратный генератор случайных чисел.
Самое простое решение.
Floksa
 
Сообщения: 101
Зарегистрирован: 09 дек 2004, 23:49
Откуда: Санкт-Петербург

Сообщение aliens » 10 фев 2005, 12:55

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

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

Кстати а как сделать именно таблицу? как в проекте робоклуба?
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение setar » 10 фев 2005, 13:13

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

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

В робоклубе в таблицу забит граф переходов автомата, это самый рациональный путь.
Аватара пользователя
setar
Site Admin
 
Сообщения: 9260
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Сообщение aliens » 10 фев 2005, 14:25

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

По смещению это типа 1<<4 или как?
aliens
 
Сообщения: 171
Зарегистрирован: 26 окт 2004, 14:16
Откуда: Севастополь сити...

Сообщение =DeaD= » 10 фев 2005, 14:35

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

Просто надо тогда будет чтобы A и B не делились на 2 :)
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

След.

Вернуться в Алгоритмы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Mail.ru counter