|
Сделать генератор псевдослучайных чисел наС |
|
|
|
 |
Ответов
|
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 17 2006, 11:54
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(singlskv @ Oct 16 2006, 18:07)  Цитата(Demeny @ Oct 16 2006, 17:19)  Это можно делать и в момент включения. Вначале ставим что-то типа
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 ... и т.д. То есть в итоге эти последовательности будут почти совпадать, за исключением первых членов, что не всегда есть хорошо  Просто поразительно как мы пытаемся думать. Привсём к Вам уважении, 'singlskv' попробуйте сами разобраться (хорошенько подумав) в том что Вы написали. 1) Последоваельность не имеет значения. Мы же не сигнализацию делаем. Но даже если она имеет значение, то любыми действиями, изменяя одну последовательность мы приходим к другой. Тоже жёско забитой. это ПСЕВДОСЛУЧАЙНЫЕ числа! Надо это понимать. 2) Объём последовательности - мощность генератора - определяется практически только ФУКЦИЕЙ (формулой) генератора псевдослучайных чисел. В рассматриваемом вопросе - это функция Си компилятора IAR. Если хотите этого избежать возьмите справочник, выберите тип распределения и напишите функцию сами. 3) Пытаясь инициализировать функцию Вы хотите получить уже случайное число. Так зачем функция? Потому, что Вы не совсем доверяете? Или Вас не устраивает мощность такого генератора? Подытоживая, - этот спор ни о чём. Выводы: 1) Объём выборки определяется только функцией. Например ф-ия X(i+1) = FRAC(11*X(i)+Pi) даёт 8000 неповторяющихся значений, а X(i+1) = FRAC(x(i)/z(i)+Pi), где Z(i+1)=Z(i)+1*10**-8. даёт 8,9*10**7 чисел. 2) Инициализацией всё равно не увеличить мощность формулы. Поэтому любой из предложенных методов является действенным. К ним я отношу. 1) Если есть, использование серийного номера или формулы с ним связанной. 2) Использование различных внешних элементов. АЦП, RC и т.д. 3) Использование формулы связаной с неинициализируемым ОЗУ. 4) Измерение WDT. И т.п. Определить что лучше что хуже на пальцах не удастся, так как это статистика. Надо определить мощность генерации случайного числа, этими способами на большом количестве изделий. Спор на "понятиях" - бессмысленен. Использование в качестве инициализирующего значения самого числа генерируемого RND не поможет. Так как речь идёт о ПЕРВОНАЧАЛЬНОМ запуске. То есть запустили партию изделий - и что? В таком случае надо сразу зашивать что-то. Тогда всё тип топ. Но это тот же первый пункт!
|
|
|
|
Сообщений в этой теме
glebka Сделать генератор псевдослучайных чисел наС Oct 13 2006, 09:56 Sanya Nemo В компиряторе с Dode Vision есть функция random()... Oct 13 2006, 10:09 glebka Цитата(Sanya Nemo @ Oct 13 2006, 14:09) В... Oct 13 2006, 10:13  Семён Тоже нет доступа к Сode Vision, может, кто подскаж... Oct 13 2006, 10:24   singlskv Цитата(Семён @ Oct 13 2006, 14:24) Тоже н... Oct 13 2006, 10:41 singlskv Цитата(demaven @ Oct 13 2006, 15:59) а да... Oct 13 2006, 12:12  glebka Цитата(singlskv @ Oct 13 2006, 16:12) Цит... Oct 13 2006, 12:15   singlskv Цитата(glebka @ Oct 13 2006, 16:15) А есл... Oct 13 2006, 12:25   Семён Цитата(glebka @ Oct 13 2006, 16:15) А есл... Oct 13 2006, 12:29    glebka Цитата(Семён @ Oct 13 2006, 16:29) Цитата... Oct 13 2006, 12:35     Семён Цитата(glebka @ Oct 13 2006, 16:35) у мен... Oct 13 2006, 12:43     singlskv Цитата(glebka @ Oct 13 2006, 16:35) у мен... Oct 13 2006, 17:47          Nanobyte Цитата(singlskv @ Oct 16 2006, 19:07) То ... Oct 16 2006, 20:03           singlskv Цитата(Nanobyte @ Oct 17 2006, 00:03) Цит... Oct 16 2006, 20:31           singlskv Цитата(SasaVitebsk @ Oct 17 2006, 15:54) ... Oct 17 2006, 13:34 Alex11 Можно попробовать подвесить вход АЦП в половину пи... Oct 13 2006, 18:40 SasaVitebsk Цитата(Alex11 @ Oct 13 2006, 21:40) Можно... Oct 14 2006, 19:08 glebka У меня каждое устройство имеет уникальный адрес за... Oct 17 2006, 08:23 singlskv Цитата(glebka @ Oct 17 2006, 12:23) У мен... Oct 17 2006, 10:08  Михаил Горюнов Цитата(singlskv @ Oct 17 2006, 14:08) Пре... Oct 17 2006, 10:21   singlskv Цитата(Михаил Горюнов @ Oct 17 2006, 14:2... Oct 17 2006, 10:50  glebka Цитата(singlskv @ Oct 17 2006, 14:08) Цит... Oct 17 2006, 10:28   singlskv Цитата(glebka @ Oct 17 2006, 14:28) Я дум... Oct 17 2006, 11:06   singlskv Цитата(glebka @ Oct 17 2006, 12:23) У мен... Oct 17 2006, 14:14    glebka [quote]
Просто в начальном посте не было понятно ч... Oct 18 2006, 14:16 Михаил Горюнов В свое время решил эту задачу так :
За начальное з... Oct 17 2006, 09:09 Михаил Горюнов Зачем вообще использовать EEPROM для генератора сл... Oct 17 2006, 10:34 glebka Цитата(Михаил Горюнов @ Oct 17 2006, 14:3... Oct 17 2006, 10:49  Михаил Горюнов Цитата(glebka @ Oct 17 2006, 14:49) Да не... Oct 17 2006, 11:04 demaven 8 передатчиков работали на одной частоте на 64 при... Oct 18 2006, 04:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|