Привет всем форумчанам. Можно ли на ардуинке сгенерировать последовательность из нескольких символов, причем должны быть использованы все символы, но только один раз. То есть если есть 6 символов, то должна получиться 6 значная последовательность.
Почему нет? Записывается случайное число 6 раз с проверкой на повтор. Или, если числа уже готовы, случайным образом перемешиваются.
Навскидку как-то так: Код (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; } } Не компилировал, только для демонстрации возможного подхода.
Записывать случайное число 6 раз с проверкой на повтор это решение пришло на ум первым, но на сколько это правильно? Мне по сути надо из набора цифр 1, 2, 3, 4, 5, 6 получить случайную комбинацию используя все 6 цифр не повторяя их.
1. создаем массив на 6 элементов 1. сбрасываем генератор рандома 2. получаем первое случайное число от 1 до 6 записываем в ячейку 1 3. получаем второе случайное число, проверяем есть ли оно в массиве, если нет, записываем в ячейку 2 4. повторяем шаги 2 и 3 пока не заполнится весь массив Выше написали пример только с алфавитом, можно переделать его под цифры 1-6. Могу сделать свой вариант. Но думаю, что вы и сами сможете.
Подумать совсем никак? Замените строчку Код (C++): char ch = random('a', 'z' + 1); на Код (C++): char ch = random('1','7'); и будет щастье.
У меня так получилось с выводом результата: Код (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() {}
Если нужны цифры только от 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); }