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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Сделать генератор псевдослучайных чисел наС
glebka
сообщение Oct 17 2006, 10:28
Сообщение #31


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

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



Цитата(singlskv @ Oct 17 2006, 14:08) *
Цитата(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) *
В свое время решил эту задачу так :
За начальное значение взял время ожидания нажатия пользователем первой кнопки. :-)
Правда при этом девайс должен содержать клавиатуру.

Прежде чем давать совет, прочитайте всю ветку.
Кнопку мы уже обсуждали smile.gif



А как засумировать область озу неинициализированного.
Сейчас роюсь в helpe для icc, может кто-нибудь сталкивался?
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 17 2006, 10:34
Сообщение #32


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Зачем вообще использовать EEPROM для генератора случайных чисел?
Не проще ли привязаться к какому либо случайному событию: Время ответа какого либо внешнего устройства....
Например завести глобальную переменную

unsigned char time_rnd;

потом в месте ожидания случайного события

time_rnd++

в цикле, который обрабатывает произошедшее событие просто зафиксировать значение этой переменной.


Вот вам и случайное число...

Если не устраивает разрядность - ее легко можно увеличить.

Сообщение отредактировал Михаил Горюнов - Oct 17 2006, 10:36


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
glebka
сообщение Oct 17 2006, 10:49
Сообщение #33


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

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



Цитата(Михаил Горюнов @ Oct 17 2006, 14:34) *
Зачем вообще использовать EEPROM для генератора случайных чисел?
Не проще ли привязаться к какому либо случайному событию: Время ответа какого либо внешнего устройства....
Например завести глобальную переменную

unsigned char time_rnd;

потом в месте ожидания случайного события

time_rnd++

в цикле, который обрабатывает произошедшее событие просто зафиксировать значение этой переменной.


Вот вам и случайное число...

Если не устраивает разрядность - ее легко можно увеличить.


Да нет никаких событий,работающее устройство должно время от времени посылать своё ID в окружающую среду, приёмник принимает и обрабатывает.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 17 2006, 10:50
Сообщение #34


дятел
*****

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



Цитата(Михаил Горюнов @ Oct 17 2006, 14:21) *
Цитата(singlskv @ Oct 17 2006, 14:08) *

Прежде чем давать совет, прочитайте всю ветку.
Кнопку мы уже обсуждали smile.gif



Прежде чем делать замечания - сами внимательно прочтите. Никто ничего подобного не предложил.

Пост #17
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 17 2006, 11:04
Сообщение #35


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(glebka @ Oct 17 2006, 14:49) *
Да нет никаких событий,работающее устройство должно время от времени посылать своё ID в окружающую среду, приёмник принимает и обрабатывает.



А устройство содержит в себе приемопередатчик, или просто передатчик?
Если есть приемник - у них довольно часто бывает регистр уровня принимаемого сигнала - чем не источник случайных чисел... ? :-)

Сообщение отредактировал Михаил Горюнов - Oct 17 2006, 11:09


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 17 2006, 11:06
Сообщение #36


дятел
*****

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



Цитата(glebka @ Oct 17 2006, 14:28) *
Я думаю где-то раз в день.

раз в день это очень редко
Ресурс eeprom в современных мк 100000 записей, в старых 10000.
В худшем случае имеем 10000/365= 27 лет smile.gif
Если еще хочеться повысить надежность, то можно писать не в одну и ту же ячейку.
Например выделяем 64 байта eeprom и пишем по кругу.
Если нужны разные последовательности на разных устройствах то начальное
значение для инициализации берем Ваше ID и при каждом последующем запуске
оно увеличивается на 1.
то есть при первом запуске:
srand(ID);
writeEEPROM(ID+1);
rand();
......
rand();
при втором запуске:
srand(ID+1);
writeEEPROM(ID+2);
rand();
......
и т.д.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 17 2006, 11:54
Сообщение #37


Гуру
******

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


дятел
*****

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


дятел
*****

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

Цитата
В принципе,я так думаю что меня устроит и постоянная последовательность главное чтобы устройства не перекрывали друг друга

Ну тогда так и делайте
srand(ID)
rand()
........
rand()

Просто в начальном посте не было понятно что же Вам нужно в итоге... smile.gif

Цитата
Да нет никаких событий,работающее устройство должно время от времени посылать своё ID в окружающую среду, приёмник принимает и обрабатывает.

То есть Вам нужно разделение одного радиоканала на много независимых передатчиков.
Тогда можно обойтись вообще без случайных чисел.
Пусть есть 10 независимых передатчиков. У каждого из них в младшей части ID записан
номер от 1 до 10.
Выбираем довольно большое число (по сравнению с количеством передатчиков)
например 1000. Для каждого передатчика время между посылками делаем пропорционально
его номеру + наша константа: T=(1000+K)N где N>двухкратного времени одиночной посылки.
Иногда конечно будут возникать коллизии, но очень не часто.

Если хочеться еще уменьшить количество коллизий, тогда нужно смотреть в сторону простых чисел.
Пусть есть 10 передатчиков.
Выбираем 10 первых простых чисел больше 1000 и прописываем их в ID.
Для каждого передатчика время между посылками делаем пропорционально этим простым
числам. коллизий будет очень мало.
Go to the top of the page
 
+Quote Post
demaven
сообщение Oct 18 2006, 04:50
Сообщение #40


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

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



8 передатчиков работали на одной частоте на 64 приемника, по 8 приемников на каждый передатчик и приемники каждый обрабатывал только тот сигнал, который им предназначался, коллизии были, без них низзя, но при 3 кратном повторе передачи ВСЕГДА информация принималась правильно, использовались простые числа практически из самого начала, 5, 7, 9, 11, 13 и т.д.
Go to the top of the page
 
+Quote Post
glebka
сообщение Oct 18 2006, 14:16
Сообщение #41


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

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



[quote]
Просто в начальном посте не было понятно что же Вам нужно в итоге... smile.gif

Прошу прощения,техническое задание корректировалось на ходу.

Пока сделал ,по варианту

srand(ID);
while(1)
{
srand(ID)
rand()
........
srand(ID++);
rand();
}

Делает вид что работает.Идея в принципе правильная,без наворотов.

Спасибо за предложенные идеи,может где ещё пригодятся.
Go to the top of the page
 
+Quote Post

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

 


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


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