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

 
 
> Сделать генератор псевдослучайных чисел наС
glebka
сообщение Oct 13 2006, 09:56
Сообщение #1


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

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



Необходимо сделать произвольную задержку времени на С.Если кто имеет подобный опыт, поделитесь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demaven
сообщение Oct 13 2006, 11:59
Сообщение #2


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

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



а данные для инициализации rnd() надо брать со случайного источника, в компьютере берут время, а в контроллере? если есть что-то меняющееся независимо от контроллера, то померять и вставить
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 15 2006, 02:34
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #9


дятел
*****

Группа: Свой
Сообщений: 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
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 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
SasaVitebsk
сообщение Oct 17 2006, 11:54
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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 ...
и т.д.

То есть в итоге эти последовательности будут почти совпадать, за исключением
первых членов, что не всегда есть хорошо sad.gif


Просто поразительно как мы пытаемся думать. smile.gif

Привсём к Вам уважении, '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 не поможет. Так как речь идёт о ПЕРВОНАЧАЛЬНОМ запуске. То есть запустили партию изделий - и что? В таком случае надо сразу зашивать что-то. Тогда всё тип топ. Но это тот же первый пункт!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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