реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Сделать генератор псевдослучайных чисел наС
defunct
сообщение Oct 15 2006, 02:34
Сообщение #16


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(demaven @ Oct 13 2006, 14:59) *
а данные для инициализации rnd() надо брать со случайного источника, в компьютере берут время, а в контроллере? если есть что-то меняющееся независимо от контроллера, то померять и вставить

В контроллере тоже можно брать время. У вас таймеров пруд-пруди, отведите один из них под системные часы.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 15 2006, 12:55
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Oct 15 2006, 06:34) *
Цитата(demaven @ Oct 13 2006, 14:59) *

а данные для инициализации rnd() надо брать со случайного источника, в компьютере берут время, а в контроллере? если есть что-то меняющееся независимо от контроллера, то померять и вставить

В контроллере тоже можно брать время. У вас таймеров пруд-пруди, отведите один из них под системные часы.

Таймером можно воспользоватся для этих целей только если в устройстве предполагается
интерактивное взаимодействие, ну например пользователь в какой-то момент жмет
кнопку, а мы измеряем время от старта устройства до нажатия на кнопку и используем
полученное время(младшую часть) как инициализацию rand(). Иначе каждый раз при старте
устройства мы будем получать одну и ту же последовательность.
Как вариант можно поставить внешний RTC и его значение использовать для инициализации rand().
Go to the top of the page
 
+Quote Post
glebka
сообщение Oct 15 2006, 20:02
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Цитата(singlskv @ Oct 15 2006, 16:55) *
Цитата(defunct @ Oct 15 2006, 06:34) *

Цитата(demaven @ Oct 13 2006, 14:59) *

а данные для инициализации rnd() надо брать со случайного источника, в компьютере берут время, а в контроллере? если есть что-то меняющееся независимо от контроллера, то померять и вставить

В контроллере тоже можно брать время. У вас таймеров пруд-пруди, отведите один из них под системные часы.

Таймером можно воспользоватся для этих целей только если в устройстве предполагается
интерактивное взаимодействие, ну например пользователь в какой-то момент жмет
кнопку, а мы измеряем время от старта устройства до нажатия на кнопку и используем
полученное время(младшую часть) как инициализацию rand(). Иначе каждый раз при старте
устройства мы будем получать одну и ту же последовательность.
Как вариант можно поставить внешний RTC и его значение использовать для инициализации rand().

да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 15 2006, 21:03
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(glebka @ Oct 16 2006, 00:02) *
да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.

Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений
Вашего устройства размещенный в EEPROM и используйте его для инициализации rand().
Будете получать при каждом включении разные последовательности псевдослучайных чисел.
Go to the top of the page
 
+Quote Post
demaven
сообщение Oct 16 2006, 03:10
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 10-05-05
Из: Киргизия Бишкек
Пользователь №: 4 886



Цитата(singlskv @ Oct 16 2006, 03:03) *
Цитата(glebka @ Oct 16 2006, 00:02) *

да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.

Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений
Вашего устройства размещенный в EEPROM и используйте его для инициализации rand().
Будете получать при каждом включении разные последовательности псевдослучайных чисел.



самое простое и действенное решение
Go to the top of the page
 
+Quote Post
Demeny
сообщение Oct 16 2006, 07:18
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(demaven @ Oct 16 2006, 07:10) *
Цитата(singlskv @ Oct 16 2006, 03:03) *

Цитата(glebka @ Oct 16 2006, 00:02) *

да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.

Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений
Вашего устройства размещенный в EEPROM и используйте его для инициализации rand().
Будете получать при каждом включении разные последовательности псевдослучайных чисел.

самое простое и действенное решение

Продолжая идею, ещё лучше сохранять многобитную псевдослучайную последовательность, накопленную генератором к текущему моменту (random seed value). Идея подсмотрена в ОС Linux (/dev/random).


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 16 2006, 07:46
Сообщение #22


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Demeny @ Oct 16 2006, 11:18) *
Цитата(demaven @ Oct 16 2006, 07:10) *

Цитата(singlskv @ Oct 16 2006, 03:03) *

Цитата(glebka @ Oct 16 2006, 00:02) *

да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.

Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений
Вашего устройства размещенный в EEPROM и используйте его для инициализации rand().
Будете получать при каждом включении разные последовательности псевдослучайных чисел.

самое простое и действенное решение

Продолжая идею, ещё лучше сохранять многобитную псевдослучайную последовательность, накопленную генератором к текущему моменту (random seed value). Идея подсмотрена в ОС Linux (/dev/random).

Да, так можно делать, но только в случае когда нам заранее известен момент выключения
устройства чтобы писать в eeprom только последнее значение.
Если писать каждое значение, то мы быстро израсходуем ресурс eeprom.
Go to the top of the page
 
+Quote Post
Demeny
сообщение Oct 16 2006, 13:19
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(singlskv @ Oct 16 2006, 11:46) *
Да, так можно делать, но только в случае когда нам заранее известен момент выключения
устройства чтобы писать в eeprom только последнее значение.
Если писать каждое значение, то мы быстро израсходуем ресурс eeprom.

Это можно делать и в момент включения. Вначале ставим что-то типа

Random_Seed_In_EEPROM = random (Random_Seed_In_EEPROM);

и вуаля!


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 16 2006, 15:07
Сообщение #24


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Demeny @ Oct 16 2006, 17:19) *
Цитата(singlskv @ Oct 16 2006, 11:46) *

Да, так можно делать, но только в случае когда нам заранее известен момент выключения
устройства чтобы писать в eeprom только последнее значение.
Если писать каждое значение, то мы быстро израсходуем ресурс eeprom.

Это можно делать и в момент включения. Вначале ставим что-то типа

Random_Seed_In_EEPROM = random (Random_Seed_In_EEPROM);

и вуаля!

Это не очень хорошо.
Пусть генерируеться такая последовательность(для примера)
1 10256 387 40001 67 23070 ...
тогда при первом включении будем иметь последовательность:
1 10256 387 40001 67 23070 ...
при втором:
10256 387 40001 67 23070 ...
при третьем:
387 40001 67 23070 ...
и т.д.

То есть в итоге эти последовательности будут почти совпадать, за исключением
первых членов, что не всегда есть хорошо sad.gif
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Oct 16 2006, 20:03
Сообщение #25


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(singlskv @ Oct 16 2006, 19:07) *
То есть в итоге эти последовательности будут почти совпадать, за исключением первых членов, что не всегда есть хорошо sad.gif

Достаточно будет перевернуть пару битов в прочитанном значении и последовательность будет совсем другая.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 16 2006, 20:31
Сообщение #26


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Nanobyte @ Oct 17 2006, 00:03) *
Цитата(singlskv @ Oct 16 2006, 19:07) *
То есть в итоге эти последовательности будут почти совпадать, за исключением первых членов, что не всегда есть хорошо sad.gif

Достаточно будет перевернуть пару битов в прочитанном значении и последовательность будет совсем другая.

Ну, фактически Вы предлагаете добавить некоторую функцию к функции rand(),
так это ни чем не будет отличаться от варианта инициализации по количеству запусков,
т.е. я добавил функцию init(N+1)=init(N)+1 , а Вы просто предлагаете добавить какую-то
другую, более сложную функцию, ну дык почему бы и нет smile.gif
В качестве варианта могу предложить например функцию построенную на числах
фибоначи init(N+2)=init(N+1)+init(N), ИМХО это должно работать красиво...
Go to the top of the page
 
+Quote Post
glebka
сообщение Oct 17 2006, 08:23
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



У меня каждое устройство имеет уникальный адрес записанный в EEPROM(6 байтов) и устройство постоянно включается,выключается поэтому частая запись нежелательна.
А что если использовать этот ID в таком виде:

вначале

void srand(unsigned seed), где unsigned seed моё id,

потом

int rand(void)


Вопрос к SasaVitebsk

как посчитать скока памяти осталось.
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 17 2006, 09:09
Сообщение #28


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



В свое время решил эту задачу так :
За начальное значение взял время ожидания нажатия пользователем первой кнопки. :-)
Правда при этом девайс должен содержать клавиатуру.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 17 2006, 10:08
Сообщение #29


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(glebka @ Oct 17 2006, 12:23) *
У меня каждое устройство имеет уникальный адрес записанный в EEPROM(6 байтов) и устройство постоянно включается,выключается поэтому частая запись нежелательна.

На сколько часто ? Сколько раз за сутки ?
Цитата(glebka @ Oct 17 2006, 12:23) *
А что если использовать этот ID в таком виде:

вначале

void srand(unsigned seed), где unsigned seed моё id,

потом

int rand(void)

Так Вы получите каждый раз одну и ту же последовательность на данном устройстве.
На других устройствах конечно будет другая последовательность но все время постоянная.


Цитата(Михаил Горюнов @ Oct 17 2006, 13:09) *
В свое время решил эту задачу так :
За начальное значение взял время ожидания нажатия пользователем первой кнопки. :-)
Правда при этом девайс должен содержать клавиатуру.

Прежде чем давать совет, прочитайте всю ветку.
Кнопку мы уже обсуждали smile.gif
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 17 2006, 10:21
Сообщение #30


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(singlskv @ Oct 17 2006, 14:08) *
Прежде чем давать совет, прочитайте всю ветку.
Кнопку мы уже обсуждали smile.gif



Прежде чем делать замечания - сами внимательно прочтите. Никто ничего подобного не предложил.

Сообщение отредактировал Михаил Горюнов - Oct 17 2006, 10:22


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016