Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Генератор случайных чисел.


Генератор случайных чисел.

Сообщений 1 страница 30 из 53

1

Уважаемые коллеги! Не будете ли вы так любезны, направить меня на путь написания проги  генератора случайных чисел? Сейчас закончил полевые испытания кротоотпугивателя, которые прошли в большей степени удачно, но появилось желание усилить эффект. В Баскоме я на уровне любителя и случайные числа мне не осилить. На сим кланяюсь. Александр.

0

2

вам в смысле Истинный Генератор Разнообразных Чисел или просто функцию RND? а вообще берете стабилитрон и садите (сажаете) на АЦП :)

0

3

AleksanderG написал(а):

Сейчас закончил полевые испытания кротоотпугивателя, которые прошли в большей степени удачно, но появилось желание усилить эффект.

С большой уверенностью, но не имея практического (личного) опыта могу предложить вам не париться с электроникой, а обратиться к имеющимся наработкам ближайших дачников... ;)
Лет "надцать" назад моя мама так и поступила на своем огороде (сейчас во многих местах это называют дачами).
Кротов вне видим до сих пор... ;)

0

4

Nord написал(а):

С большой уверенностью, но не имея практического (личного) опыта могу предложить вам не париться с электроникой, а обратиться к имеющимся наработкам ближайших дачников


Если нет ответа на вопрос, тогда не надо давать советов.

0

5

AleksanderG
RND чем не устраивает? вряд ли у вас кроты-криптоаналитики шастают

0

6

Всем спасибо. Буду пробивать RND. Ну кроты держитесь. Тему можно закрыть.

Отредактировано AleksanderG (2018-06-20 20:55:51)

0

7

AleksanderG написал(а):

Буду пробивать RND

а чего там пробивать? Х = RND (число). чем число больше - тем ширше разнообразие. генератор считает от 0 до "число", тип переменной - Integer

0

8

маленький нюанс - протеус (у меня) не любит эту функцию и не запускает симуляцию. так што отсимулировать вряд ли удастся

0

9

Примеры работы RND баскома:

И ещё больше:

http://vimeo.com/123216886

+1

10

А можно как то сделать генератор реальных случайных чисел? Значения от 1 до 3000. Это нужно для организации режима Random DFPlayer'а. Там есть такая функция, но как я понял, она работает с числами не больше 255. Если в папке 255 треков, то работает нормально. Но не хочется заморачиваться с папками. В корень карты памяти можно положить 3000 треков. Вот среди них хотелось бы сделать случайный выбор.

0

11

В данном случае надо обязательно делать проверку на повтор.
Как-то при написании программы (VB6) для тестирования использовал такой подход:
1. Формируем таблицу (массив) из нужного количества значений.
2. Генерируем RND-число.
3. Заносим в таблицу и запоминаем позицию.
4. Если таблица "закончилась" - выходим из цикла генерации.
5. Генерируем RND-число.
6. Проверяем с начала таблицы до последней записанной (п.3) на наличие повтора.
7. Если встретили повтор, то возвращаемся на п.5
8. Если повторы не встречены, то возвращаемся на п.3

3000 вопросов разносить не приходилось, но с 200...300 ПК "раскладывал" за 1...2 сек.
Да и возможности RND пошире... ;)

0

12

Andrusha написал(а):

А можно как то сделать генератор реальных случайных чисел? Значения от 1 до 3000.

По поводу генерации RND больше 255...

Мой вариант алгоритма:
1. Генерируем RND * 255 (базовое значение)
2. Генерируем RND * 12 (множитель)
3. <базовое значение> * <множитель> = <результат>
4. Заполняем таблицу значений...

Значение <результат> может получиться до 3060, т.ч. надо этот момент предусмотреть.

0

13

Nord написал(а):

но с 200...300 ПК "раскладывал" за 1...2 сек.

Слишком медленно для ПК.

Nord написал(а):

1. Формируем таблицу (массив) из нужного количества значений.

Если не предпринять специальных мер, при каждом включении или сбросе будет генерироваться одна и та же последовательность чисел. Для МК с его ограниченным размером флеша, хранить таблицу из 3000 16-ти битных значений нерационально. Потребуется 6 КБ флеша.

0

14

Пётр написал(а):

Nord написал(а):но с 200...300 ПК "раскладывал" за 1...2 сек.
Слишком медленно для ПК.

Ну, это я по памяти писал, причем отталкивался от визуальных событий, когда после заполнения таблицы менялась картинка...
А 1 или 0,2 секунды - кто ж замерял... ;)
К тому же это было году в 2005-м, когда "компьютеры еще были большие"... ;)

Пётр написал(а):

Nord написал(а):1. Формируем таблицу (массив) из нужного количества значений.
Если не предпринять специальных мер, при каждом включении или сбросе будет генерироваться одна и та же последовательность чисел.

Возможно, что на МК так будет, на ПК генерировалось нормально.

Пётр написал(а):

Для МК с его ограниченным размером флеша, хранить таблицу из 3000 16-ти битных значений нерационально. Потребуется 6 КБ флеша.

Ну - это уже вопрос к Andrusha, где он будет память чЕрпать... ;)

Отредактировано Nord (2019-04-01 13:26:25)

0

15

3000 - это я по максимуму посчитал. Но все равно даже 1 КБ найти будет проблемой. МК Мега8, но в ней уже приемник RDA5807 и аудиопроцессор TDA7439. Занято 57 %. Еще впихнется DFPlayer, и это все нужно будет согласовать. Скорее всего памяти не останется. Мегу 328 использовать не буду.
Я наверное, немного не правильно выразился по поводу случайных чисел. Не обязательно перебрать все 3000 значений и не повториться. Важнее, чтобы при каждом включении комбинация чисел не повторялась, как с RND.
Я вот что придумал. Если использовать TIMER1 для этих целей? Запускаем таймер, и пусть он молотит до 3000, а точнее до количества треков на карте памяти. Когда плеер выдал, что он закончил играть очередной трек, я беру значение таймера, как номер следующего трека и отправляю его в плеер. Сравню, конечно, с номером предыдущего трека, чтобы не повторяться.
Сегодня поздно, завтра попробую в железе.

0

16

Andrusha написал(а):

Я вот что придумал. Если использовать TIMER1 для этих целей? Запускаем таймер, и пусть он молотит до 3000, а точнее до количества треков на карте памяти. Когда плеер выдал, что он закончил играть очередной трек, я беру значение таймера, как номер следующего трека и отправляю его в плеер.

Проиграли песню длительностью 3:52...
Вызвали таймер...
Проиграли следующую песню, а она, вот чисто случайно, оказалась тоже 3:52...

Что дальше играть будем ? ;)

0

17

Лажа будет, если с каждой новой песней таймер будет считать сначала. А так, я его запускаю после получения общего количества треков, и он молотит постоянно. Да и где гарантия, что две песни по времени звучания будут совпадать аж до сотых секунды. А за одну сотую секунды таймер нащелкает... Ого сколько он нащелкает. Ну, короче, буду пробовать в железе, а там видно будет.

0

18

Andrusha написал(а):

Да и где гарантия, что две песни по времени звучания будут совпадать аж до сотых секунды.

В любом случае надо иметь таблицу, но в нее писать номера уже прозвучавших, чтоб не было повторов.
Где гарантия, что таймер не натикает то же значение ? ;)

0

19

Nord написал(а):

В любом случае надо иметь таблицу

Не надо.

Код:
x = Timer1 Mod 3000
Nord написал(а):

Где гарантия, что таймер не натикает то же значение ?

Вероятность 1 из 65536.
Но в данном случае 1 из 3000.

0

20

Можно к часам привязать, том точно не натикает в течении суток..

0

21

Попробовал работу RND в Протеусе.

Код:
$Regfile="m48pdef.dat"
$Crystal=8000000
$hwstack=16
$swstack=16
$framesize=32
$baud = 9600

Dim a As Integer

Do

a = Rnd(3000)
Print a

Loop
End

Вполне адекватно генерит "случайности".
Проверку на дубликаты не делал.
Данные (фрагмент) из Терминала Протеуса:

Свернутый текст

803
2994
357
1532
215
1470
257
1312
1971
2378
1397
836
1495
2590
2089
1704
451
2898
2029
1364
31
2942
225
1184
1667
746
1677
1380
1247
2182
2625
1480
2507
1578
2765
1468
1103
1574
177
2712
1467
658
789
2892
2023
1238
377
608
971
1106
1637
2308
431
2902
113
360
443
2114
1733
1444
823
222
1809
1624
2307
2410
37
420
87
1390
961
592
2059
1650
1509
1428
647
2598
2993
1992
2587
2026
2573
2732
1463
2574
1793
2480
315
2730
2653
1452
1495
1438
1857
1248
2739
2954
1173
2316

Отредактировано Nord (2019-04-02 13:28:07)

0

22

Адекватно, спору нет. Но, попробуйте выключить и снова включить. Последовательность чисел должна повториться. Поэтому меня и не устраивает. Спасибо за все предложенные варианты. Как появится свободное время, сразу все опробую.

0

23

Уже ж обсуждали эту функцию RND.
Во что в хелпе, по этому поводу...

Notice that it is a software based generated number. And each time you will restart your program the same sequence will be created.
Обратите внимание, что это программный номер. И каждый раз, когда вы перезапустите вашу программу, будет создаваться одна и та же последовательность.

0

24

Если программно не получается, надо делать в железе. Например, первая же ссылка: https: //www.kit-e.ru/preview/pre_136_1_14_heng_vsb.php

0

25

Andrusha написал(а):

Адекватно, спору нет. Но, попробуйте выключить и снова включить. Последовательность чисел должна повториться.

Запускал в Протеусе несколько раз - последовательность была разная.
Потому и написал про "адекватность"...
Завтра только смогу повторить попытки. ;)

0

26

Nord написал(а):

Запускал в Протеусе несколько раз - последовательность была разная.

У вас протеус неадекватный.  8-)  А вообще я уже практически решил этот вопрос. Сейчас тестирую вариант с таймером 1. Пока все чудесно. Из десяти треков ни одного повторения, треки берутся из разных мест. И это еще без контроля повторяемости. Одурел уже от этой музыки  :angry:

0

27

RND функция имеет право на существование.
Но для получения разных начальных значений её при старте контроллера нужно инициализировать случайным значением.  o.O
Задаёшь ___rseed (в справке об этом есть).
Где взять это случайное значение? Вариантов много.
Младшие разряды АЦП, системное время, и ....

0

28

Сейчас попробовал RND в железе, но без ___rseed. В памяти был сохранен трек 0001. Он проиграл, потом 0147, потом 0005. Остановил, последний трек записался в память. Через некоторое время включаю, проиграл трек 0005, потом 0147, потом опять 0005. Как и написано в ХЕЛПЕ. Завтра почитаю, что за зверек такой rseed. Но с таймером меня пока устраивает.  Погоняю завтра подольше.

0

29

Andrusha написал(а):

У вас протеус неадекватный.  8-)  А вообще я уже практически решил этот вопрос.

Ну, раз все решено, то не буду больше мучать "неадекватного"...

0

30

radan написал(а):

Где взять это случайное значение?

Можно взять номер последнего игравшего трека, я его запоминаю.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Генератор случайных чисел.