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

 
 
> Сделать генератор псевдослучайных чисел наС
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
singlskv
сообщение Oct 17 2006, 13:34
Сообщение #13


дятел
*****

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



Цитата(SasaVitebsk @ Oct 17 2006, 15:54) *
1) Последоваельность не имеет значения. Мы же не сигнализацию делаем. Но даже если она имеет значение, то любыми действиями, изменяя одну последовательность мы приходим к другой. Тоже жёско забитой. это ПСЕВДОСЛУЧАЙНЫЕ числа! Надо это понимать.

Замечу, что в своих постах я неоднакратно подчеркивал что
последовательность псевдослучайная smile.gif
Цитата
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 ........
генератор один - мощность одна, а значения разные smile.gif
Цитата
Использование в качестве инициализирующего значения самого числа генерируемого RND не поможет. Так как речь идёт о ПЕРВОНАЧАЛЬНОМ запуске. То есть запустили партию изделий - и что? В таком случае надо сразу зашивать что-то. Тогда всё тип топ. Но это тот же первый пункт!

Ну дык для первоначального запуска у автора топика есть оригинальные ID
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
- - 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 Текстовая версия Сейчас: 19th July 2025 - 16:53
Рейтинг@Mail.ru


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