|
Сделать генератор псевдослучайных чисел наС |
|
|
|
 |
Ответов
|
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 не поможет. Так как речь идёт о ПЕРВОНАЧАЛЬНОМ запуске. То есть запустили партию изделий - и что? В таком случае надо сразу зашивать что-то. Тогда всё тип топ. Но это тот же первый пункт!
|
|
|
|
|
Oct 17 2006, 13:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Oct 17 2006, 15:54)  1) Последоваельность не имеет значения. Мы же не сигнализацию делаем. Но даже если она имеет значение, то любыми действиями, изменяя одну последовательность мы приходим к другой. Тоже жёско забитой. это ПСЕВДОСЛУЧАЙНЫЕ числа! Надо это понимать. Замечу, что в своих постах я неоднакратно подчеркивал что последовательность псевдослучайная Цитата 2) Объём последовательности - мощность генератора - определяется практически только ФУКЦИЕЙ (формулой) генератора псевдослучайных чисел. В рассматриваемом вопросе - это функция Си компилятора IAR. Если хотите этого избежать возьмите справочник, выберите тип распределения и напишите функцию сами. Вот здесь я с Вами согласен Цитата 3) Пытаясь инициализировать функцию Вы хотите получить уже случайное число. Так зачем функция? Потому, что Вы не совсем доверяете? Или Вас не устраивает мощность такого генератора? Не пытаюсь получить абсолютно случайное, а пытаюсь сделать так чтобы при каждом новом старте устройства, последовательность начиналась с разных мест. Цитата 2) Инициализацией всё равно не увеличить мощность формулы. Поэтому любой из предложенных методов является действенным. Мощность не увеличит, а вот разные последовательности получить можно. Пример: Пусть у нас есть некий генератор с диапазоном 1 - 100 Пусть при подстановке стартового значения 1 мы получим следующую последовательность: 1 78 36 49 84 8 23 58 63 94 1 78 ........ и далее зациклились А при стартовом значении 2 : 2 91 47 5 53 17 72 25 88 39 2 91 ........ генератор один - мощность одна, а значения разные Цитата Использование в качестве инициализирующего значения самого числа генерируемого RND не поможет. Так как речь идёт о ПЕРВОНАЧАЛЬНОМ запуске. То есть запустили партию изделий - и что? В таком случае надо сразу зашивать что-то. Тогда всё тип топ. Но это тот же первый пункт! Ну дык для первоначального запуска у автора топика есть оригинальные ID
|
|
|
|
Сообщений в этой теме
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 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
|
|
|