Массив останавливается.

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
C++:
const int rows = 5;           // Количество строк
const int cols = 5;           // Количество столбцов
const int totalElements = 25; // Общее количество элементов
int randomNumbers[rows][cols]; // Двумерный массив
bool usedNumbers[101] = { false }; // Маска для отслеживания использованных чисел

void setup() {
    Serial.begin(9600); // Инициализация последовательного порта со скоростью 9600 бод
    
}

void loop() {
   randomSeed(analogRead(0)); // Инициализация генератора случайных чисел

    // Заполнение двумерного массива случайными уникальными числами от 100 до 200
    int count = 0;
    while (count < totalElements) {
        int num = random(100, 201); // Генерация случайного числа в диапазоне от 100 до 200
        
        if (!usedNumbers[num - 100]) { // Проверка, использовалось ли число
            usedNumbers[num - 100] = true; // Отметить число как используемое
            randomNumbers[count / cols][count % cols] = num; // Заполнение двумерного массива
            count++; // Увеличиваем счетчик добавленных чисел
        }
    }

    // Вывод двумерного массива в последовательный порт
    Serial.println("Случайные уникальные числа в двумерном массиве:");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            Serial.print(randomNumbers[i][j]); // Печать каждого числа массива
            Serial.print("   "); // Разделитель между элементами
        }
        Serial.println(); // Переход на новую строку после завершения вывода строки массива
    }
    delay (3000);
}
Здравствуйте!
Столкнулся с проблемой. Код выполняется несколько раз и в СериалПорт перестают отправляться данные.
Опытным путём установил, что всё зависит от размера массива. Использую Леонардо. Думаю, что это переполняется память энергозависимая.
Подскажите, эта проблема решается?
 

Сотнег

★★★★★★★
15 Янв 2020
4,407
1,509
@НикитаТангер,
4 раза выполняется, а потом зависает, потому что все 100 чисел уже использовались, да?

Вам точно нужен такой непредсказуемый по времени рандомайзер, а не классическая "колода карт" с перемешиванием?
 
  • Лойс +1
Реакции: НикитаТангер

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
@Сотнег,
переделал без проверки, и пришёл к выводу, что она тормозит. Вы правы.
Да, колода карт не подойдёт, нужны "действительно" случайные числа.
 

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
@Сотнег,
:) первый раз вылез за возможности памяти МК. Обычно хватало, колодочный расчёт делал в exel и вставлял. А тут решал ахфтоматизировать...
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@НикитаТангер, "действительно случайные числа" могут повторяться даже в пределах количества возможных значений, некоторые числа в последовательности в этом случае будут отсутствовать, и это - правильно. То, что Вы пытаетесь получить является именно тем, что назвал @Сотнег - случайным расположением детерминированной последовательности значений.
Но даже применённый Вами метод будет (хоть и медленно) работать, нужно только очищать массив использованных чисел с заданной периодичностью.
 

НикитаТангер

✩✩✩✩✩✩✩
22 Июл 2024
9
0
@Эдуард Анисимов, судя по моим предположениям в теме, я ещё не вырос и из Ардуинки, практики мало, да и понимания.

@poty, спасибо за совет. Постараюсь добавить очистку при достижении максимума.