|
|
  |
Сделать генератор псевдослучайных чисел наС |
|
|
|
Oct 15 2006, 12:55
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Oct 15 2006, 06:34)  Цитата(demaven @ Oct 13 2006, 14:59)  а данные для инициализации rnd() надо брать со случайного источника, в компьютере берут время, а в контроллере? если есть что-то меняющееся независимо от контроллера, то померять и вставить
В контроллере тоже можно брать время. У вас таймеров пруд-пруди, отведите один из них под системные часы. Таймером можно воспользоватся для этих целей только если в устройстве предполагается интерактивное взаимодействие, ну например пользователь в какой-то момент жмет кнопку, а мы измеряем время от старта устройства до нажатия на кнопку и используем полученное время(младшую часть) как инициализацию rand(). Иначе каждый раз при старте устройства мы будем получать одну и ту же последовательность. Как вариант можно поставить внешний RTC и его значение использовать для инициализации rand().
|
|
|
|
|
Oct 15 2006, 20:02
|
Частый гость
 
Группа: Свой
Сообщений: 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 и батарейка.
|
|
|
|
|
Oct 15 2006, 21:03
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(glebka @ Oct 16 2006, 00:02)  да ничего нету,только операционник вклученый по схеме ripper detector и батарейка. Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений Вашего устройства размещенный в EEPROM и используйте его для инициализации rand(). Будете получать при каждом включении разные последовательности псевдослучайных чисел.
|
|
|
|
|
Oct 16 2006, 03:10
|

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

|
Цитата(singlskv @ Oct 16 2006, 03:03)  Цитата(glebka @ Oct 16 2006, 00:02)  да ничего нету,только операционник вклученый по схеме ripper detector и батарейка.
Тогда можете поступить вот так, каждый раз при старте мк увеличиваете счетчик включений Вашего устройства размещенный в EEPROM и используйте его для инициализации rand(). Будете получать при каждом включении разные последовательности псевдослучайных чисел. самое простое и действенное решение
|
|
|
|
|
Oct 16 2006, 07:18
|

Знающий
   
Группа: Свой
Сообщений: 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).
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Oct 16 2006, 07:46
|
дятел
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 16 2006, 13:19
|

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

|
Цитата(singlskv @ Oct 16 2006, 11:46)  Да, так можно делать, но только в случае когда нам заранее известен момент выключения устройства чтобы писать в eeprom только последнее значение. Если писать каждое значение, то мы быстро израсходуем ресурс eeprom. Это можно делать и в момент включения. Вначале ставим что-то типа Random_Seed_In_EEPROM = random (Random_Seed_In_EEPROM); и вуаля!
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Oct 16 2006, 15:07
|
дятел
    
Группа: Свой
Сообщений: 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 ... и т.д. То есть в итоге эти последовательности будут почти совпадать, за исключением первых членов, что не всегда есть хорошо
|
|
|
|
|
Oct 16 2006, 20:31
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Nanobyte @ Oct 17 2006, 00:03)  Цитата(singlskv @ Oct 16 2006, 19:07)  То есть в итоге эти последовательности будут почти совпадать, за исключением первых членов, что не всегда есть хорошо  Достаточно будет перевернуть пару битов в прочитанном значении и последовательность будет совсем другая. Ну, фактически Вы предлагаете добавить некоторую функцию к функции rand(), так это ни чем не будет отличаться от варианта инициализации по количеству запусков, т.е. я добавил функцию init(N+1)=init(N)+1 , а Вы просто предлагаете добавить какую-то другую, более сложную функцию, ну дык почему бы и нет В качестве варианта могу предложить например функцию построенную на числах фибоначи init(N+2)=init(N+1)+init(N), ИМХО это должно работать красиво...
|
|
|
|
|
Oct 17 2006, 10:08
|
дятел
    
Группа: Свой
Сообщений: 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)  В свое время решил эту задачу так : За начальное значение взял время ожидания нажатия пользователем первой кнопки. :-) Правда при этом девайс должен содержать клавиатуру. Прежде чем давать совет, прочитайте всю ветку. Кнопку мы уже обсуждали
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|