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

Тема в разделе "Arduino & Shields", создана пользователем Эникей, 3 сен 2019.

  1. Эникей

    Эникей Нуб

    В общем, решил сделать аппаратный генератор случайных чисел на Ардуино ( только 2 числа: 1 - True, 0 - False). Именно аппаратный генератор (не путать с ГПСЧ). Решил сделать так: считываем значение с аналогового пина, к которому ничего не подключено (считываются случайные помехи). Дополнительно, на другой аналоговый пин поставил потенциометр, чтобы можно было вручную подрегулировать вероятность появление True или False. Но дело в том, что по какой-то причине последовательность сгенерированных чисел постоянно повторяется. Как-будто считываются не помехи, а какой-то реальный сигнал. В чем проблема?
    Методика такая: считаем разность двух подряд идущих чисел. Если разность пренадлежит определенному интервалу, то выводим True, если не пренадлежит - выводим False. Интервал задается с помощью потенциометра.
    По какой-то непонятной мне причине он выводит числа примерно так: 99 101 254 51 83 114 99 101 254 51 83 114 99 101 254 51 83 114 99 102 254 50 83 99 101....., Соответственно, последовательность True и False не случайна, а она всё время повторяется. Как с этим бороться? Почему так происходит?
    Код:
    Код (C++):
    int summ, pred, set;
    boolean result;

    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      pred = summ;
      summ = analogRead(A5);
      set = map(analogRead(A0), 0, 1023, 15, 150);
      if (summ - pred > set or pred - summ > set){
        result = true;
      }else{
        result = false;
      }
      Serial.print(summ);
      Serial.print("  ---  ");
      Serial.print(pred);
      Serial.print("  ---  ");
      Serial.println(result);

    }
    A5 - аналоговый пин, к которому ничего не подключено. По идее, при считывании с него каких-либо данных эти данные должны быть абсолютно случайны (просто помехи)
    A0 - пин с потенциометром.
     
  2. b707

    b707 Гуру

    сравнивая эти две фразы - уже смешно :)
     
    Daniil, issaom и Эникей нравится это.
  3. Эникей

    Эникей Нуб

    Смех смехом, а сделано это для того, чтобы не подбирать интервал вручную. Я же не знаю заранее, в каком диапазоне прыгают помехи на пине, а мне нужно получить т.н. Нормальное распределение. То есть, последовательность не должна повторяться, но количество true и false во всей последовательности должно быть примерно одинаковым.
    Даже если убрать потенциометр и задать интервал прямо в прошивке, то это ничего не поменяет. Всё равно будет идти повторяющаяяся последовательность. С чем это связано?
     
  4. issaom

    issaom Гуру

    А просто чет/нечет не пробовали ? Зачем Вам интервал ?
     
    Эникей нравится это.
  5. Daniil

    Daniil Гуру

    тервер?
    Как раз таки на пин наводится шум Нормальный)
    наводится он как в + так и в - относительно нуля. Ацп преобразует только то, что больше нуля.
    Величина шума, не думаю, что больше 100 мВ. 100мВ это 20 единиц ацп.
    Я бы собирал число (допустим от 0 до 7) по первым битам оцифрованного напряжения (равномерное распределение) и вычислял бы как в настолках броски кубиков - менял форму распределения. Надо гуглить что-то про дайсы (dice). Вот нашел
     
    Последнее редактирование: 8 сен 2019
  6. parovoZZ

    parovoZZ Гуру

    это не так. Там будут не случайные помехи, а очень сильно коррелированные с выполняющейся программой. Истинно белый ШУМ снять можно с радиоприемника с хорошей развязкой от МК.
     
    Igor68 нравится это.