Функция random()

Тема в разделе "Arduino & Shields", создана пользователем maxS2004, 18 сен 2019.

  1. maxS2004

    maxS2004 Гик

    Здраствуйте. столкнулся с функцией random.
    Посоветуйте как сделать что б вначале скетча допустим переменная А приняла одно единственное случайное значение. Да и ещё вопрос, можно ли создать массив со случайными значениями и что б эти значения не менялись?
    Работаю в Ide arduino
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Можно.
     
  3. parovoZZ

    parovoZZ Гуру

    сам придумай и запихни в EEPROM)))
     
    DetSimen и NikitOS нравится это.
  4. maxS2004

    maxS2004 Гик

    А можно по подробней,у самого котелок не варит
     
  5. NikitOS

    NikitOS Король шутов Администратор

    В setup
    Код (Text):
    int val1 = random(0, 1000);
    Или
    Код (Text):
    int val2[];
    for(int i; i<10; i++) {
      val2[i] = random(0, 1000);
    }
    Хотя я не знаю, работает ли последнее, или нет.. :)
     
    arkadyf и maxS2004 нравится это.
  6. maxS2004

    maxS2004 Гик

    спасибо большое. писал в loop, не догадался до setup,теперь буду знать
     
  7. asam

    asam Гик

    Проблема в том, что каждый раз после рестарта в val1 будет одно и тоже значение. Так как это генератор псевдослучайных чисел. Что бы получить реально случайное число можно померять напряжение на"висящем" пине и использовать это значение в randomSeed().

    Код (Text):
    void setup() {
      randomSeed(analogRead(A0));
      int val = random(0, 1000);
      Serial.begin(115200);
      Serial.println(val);

    }

    void loop() {}
     
  8. parovoZZ

    parovoZZ Гуру

    Это тоже генератор совсем не случайных чисел.
     
  9. asam

    asam Гик

    Последовательность будет псевдослучайная, но первое значение, которое нужно ТС, будет случайным.
     
  10. parovoZZ

    parovoZZ Гуру

    Не будет. Оно будет сильно коррелировано с выполнением программы. Да, и что такое псевдослучайное значение?
     
  11. asam

    asam Гик

    Можно поподробнее?

    . Я говорил о псевдослучайных числах. Это элемент псевдослучайной последовательности. Т.е. последовательно чисел распределение которых выглядит похожим на распределение реально случайных чисел но однозначно вычисляемых по предыдущим элементам последовательности. Ну если знать алгоритм, конечно.
     
  12. parovoZZ

    parovoZZ Гуру

    Псевдослучайные числа образуют псевдошумовой сигнал. Почему псевдо и почему шумовой? Шумовой - т.к. распределение значений на спектральной плоскости равномерно (в заданном диапазоне). Псевдо - т.к. закономерность значений нам известна. Генератор псевдошума простой, а весь шарм кроется в инициализирующей последовательности. Такие генераторы не редко используются в поточном кодировании, поэтому от инициализирующей последовательности зависит криптостойкость полезного сигнала.

    При каждом запуске МК выполняет одни и те же действия.Поэтому и воздействие на не подключенный пин одно и то же. Настоящие генераторы случайной последовательности делают из радиотрансиверов с хорошей развязкой от МК по питанию.
     
  13. asam

    asam Гик

    Ну да, а дважды два это четыре. А еще Волга впадает в Каспийское море.

    Значение получамое с АЦП на висящем пине зависит не только от того что делает МК но и от шумов БП, шумов электролитов в цепях питания, шумов на p-n переходах коммутатора аналогового сигнала и даже от наличия рядом человеских тел и влажности воздуха. Может этого и недостаточно для высоконадежной криптографии потому что разрядность небольшая, но с бытовой точки зрения это достаточно хорошее случайное число
     
  14. parovoZZ

    parovoZZ Гуру

    Можно сгенерировать любое другое распределение. Хоть треугольное, хоть Гауссово...

    далеко ходить не будем. Вот было совсем недавно
    http://forum.amperka.ru/threads/Генератор-случайных-чисел-на-Ардуино.19204/
     
  15. asam

    asam Гик

    У ТС не стояло задачи получить истинно белый шум. Нужно было получить на старте случайное число. То что ему посоветовали в #5 давало бы одно и то же число каждый раз при перезапуске. Использование randomSeed(analogRead(<floating pinN>)); Дает достаточно неплохой результат для бытовых целей.

    Вот результат работы программы на Нано

    Код (C++):
    void setup() {
      Serial.begin(115200);
      int val= analogRead(A0) & 0x7f;
      Serial.println(val,BIN);
    }

    void loop() {}
    И многократного нажатия на ресет карандашиком (что бы пины не задевать).
    Код (Text):

    1100000
    0001110
    0111100
    0110111
    1110110
    0000110
    1000111
    0111000
    1001111
    1001001
    1010001
    0010100
    1000010
    1010010
    1000110
    0110010
    1001010
    0010101
    1010010
    0000001
    0111100
    0010111
    0011001
    0111101
    0111001
    0111101
    0000111
    0111010
    0110011
    0001011
    0100101
    0011001
    0111011
    1001110
    0010010
    0111111
    0001011
    0011000
    0001010