Генератор последовательности

Тема в разделе "Arduino & Shields", создана пользователем gorbuni4, 11 авг 2016.

  1. gorbuni4

    gorbuni4 Нуб

    Привет всем форумчанам. Можно ли на ардуинке сгенерировать последовательность из нескольких символов, причем должны быть использованы все символы, но только один раз. То есть если есть 6 символов, то должна получиться 6 значная последовательность.
     
  2. ostrov

    ostrov Гуру

    Почему нет? Записывается случайное число 6 раз с проверкой на повтор.

    Или, если числа уже готовы, случайным образом перемешиваются.
     
  3. DIYMan

    DIYMan Guest

    Навскидку как-то так:
    Код (C++):
    char sequence[7] = {0};

    void generate_sequence()
    {
        byte writePos = 0;

        while(writePos < 7)
        {
            char ch = random('a', 'z' + 1);
            bool found = false;
            for(byte i=0;i<=writePos;i++)
            {
                if(sequence[i] == ch)
                {
                    found = true;
                    break;
                }
            }
            if(found)
                continue;
               
            sequence[writePos++] = ch;
        }
    }
    Не компилировал, только для демонстрации возможного подхода.
     
  4. ostrov

    ostrov Гуру

    Сверху еще так:
    Код (C++):
    randomSeed(analogRead(A0));
     
    Последнее редактирование: 12 авг 2016
  5. gorbuni4

    gorbuni4 Нуб

    Записывать случайное число 6 раз с проверкой на повтор это решение пришло на ум первым, но на сколько это правильно? Мне по сути надо из набора цифр 1, 2, 3, 4, 5, 6 получить случайную комбинацию используя все 6 цифр не повторяя их.
     
  6. ostrov

    ostrov Гуру

    1. создаем массив на 6 элементов
    1. сбрасываем генератор рандома
    2. получаем первое случайное число от 1 до 6 записываем в ячейку 1
    3. получаем второе случайное число, проверяем есть ли оно в массиве, если нет, записываем в ячейку 2
    4. повторяем шаги 2 и 3 пока не заполнится весь массив

    Выше написали пример только с алфавитом, можно переделать его под цифры 1-6. Могу сделать свой вариант. Но думаю, что вы и сами сможете.
     
  7. DIYMan

    DIYMan Guest

    Подумать совсем никак? Замените строчку
    Код (C++):
    char ch = random('a', 'z' + 1);
    на
    Код (C++):
    char ch = random('1','7');
    и будет щастье.
     
  8. ostrov

    ostrov Гуру

    У меня так получилось с выводом результата:
    Код (C++):

    void setup() {
      byte rnd[6];
      bool found;

      randomSeed(analogRead(A0));

      for (byte i = 0; i < 6; i++) {
        found = false;
        byte a = random (1, 7);
        for (byte ii = 0; ii <= i; ii++) {
          if (rnd[ii] == a) found = true;
        }
        found ? i-- : rnd[i] = a;
      }

      Serial.begin(9600);
      for (byte i = 0; i < 6; i++) Serial.print(rnd[i]);
    }

    void loop() {}
     
     
    Последнее редактирование: 12 авг 2016
  9. DIYMan

    DIYMan Guest

    Если нужны цифры только от 1 до 6 - то можно проще написать, в принципе - тупой перестановкой:
    Код (C++):
    byte rnd[7] = {1,2,3,4,5,6};

    void shuffle(byte count_passes)
    {
        for(byte i=0;i<count_passes;i++)
        {
            byte idx1 = random(0,7);
            byte idx2 = random(0,7);
            if(idx1 == idx2)
                continue;
               
            byte b = rnd[idx1];
            rnd[idx1] = rnd[idx2];
            rnd[idx2] = b;
        }
    }

    void loop()
    {
        // когда надо - перемешали массив, скажем, раз 10
        shuffle(10);
    }
     
  10. ostrov

    ostrov Гуру

    Перемешали случайное число раз!
    Код (C++):
        shuffle(random(10,100));
    ))
    Но проще ли это?