Генератор случайных чисел с использованием 8051
Download 231.89 Kb.
|
Курсовая работа А.Иброхимов (3)
ПриложениеВ проектах на Arduino для получения псевдослучайного числа предусмотрена функция random(). В параметрах функции можно задать диапазон получаемых значений, от минимального до максимального. long randNumber; void setup(){ Serial.begin(9600); } void loop() { randNumber = random(1000); // выбираем случайное число от 0 до 999 Serial.println(randNumber); // выводим число в Serial Port delay(1000); // ждём одну секунду } Если вы запустите этот скетч, увидите, что после каждого перезапуска платы последовательность чисел будет повторяться. Чтобы последовательность не повторялась, необходимо запустить генератор случайных чисел со случайным параметром. Для этого предусмотрена функция randomSeed(). В качестве параметра функции зададим номер свободного аналогового пина. Шум с него инициализирует генератор случайных чисел. long randNumber; void setup(){ Serial.begin(9600); } void loop() { randNumber = random(1000); // выбираем случайное число от 0 до 999 Serial.println(randNumber); // выводим число в Serial Port delay(1000); // ждём одну секунду } Автомат для игры «Орёл и Решка» Это самый простой игровой автомат. Arduino Uno, пара светодиодов и тактовая кнопка. Нажимаете кнопку — случайным образом загорается один из светодиодов: или красный, или зелёный. В проекте использовались: Arduino Uno Slot Shield Индикаторные светодиоды Тактовая кнопка // подключим библиотеку для работы с кнопками #include // Пины светодиодов #define LRED 8 #define LGREEN 10 // Пин кнопки #define BUTTON 6 // создаем объект класса TroykaButton TroykaButton but(BUTTON); unsigned long timer = 0; void setup() { // определяем пины как входы/выходы pinMode (LRED, OUTPUT); pinMode (LGREEN, OUTPUT); pinMode (BUTTON, INPUT_PULLUP); // инициализируем последовательность случайных чисел randomSeed(analogRead(A3)); // инициализируем кноку but.begin(); } void loop() { // считываем значение кнопки but.read(); // было ли короткое нажатие? if (but.isClick()) { // задаем случайное значение для "монеты" int coin = random(2); // проверяем, что за значение: if (coin) { // если 1, то зеленый светодиод горит 1 секунду timer = millis(); while (millis() - timer < 1000) { digitalWrite(LGREEN, HIGH); } digitalWrite(LGREEN, LOW); } else { // если 0, то красный светодиод горит 1 секунду timer = millis(); while (millis() - timer < 1000) { digitalWrite(LRED, HIGH); } digitalWrite(LRED, LOW); } } } Автомат «Три семёрки» Игровой автомат генерирует трёхзначное число. Если всецифры в нём совпали — Bingo! Если нет, попробуйте свою удачу ещё раз. В проекте использовались: Arduino Uno Slot Shield Тактовая кнопка четырёхразрядный дисплей Quad Display // Подключаем библиотеку для работы с дисплеем #include #include // Пин для пищалки #define BUZZER 4 // Пин для кнопки #define BUTTON 6 // Пин для дисплея #define QUADDISPLAY 10 // ноты для мелодий #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 // Номер октавы #define OCTAVE 2 // Длительность таймера #define CLOCK 1000 // создаем объект класса QuadDisplay и передаем номер пина CS QuadDisplay qd(QUADDISPLAY); // создаем объект для работы с кнопкой с параметром номер пина TroykaButton button(BUTTON); // создаем флаг для кнопки bool buttonFlag = true; // создаем объект класса long для хранения счетчика времени unsigned long timer; // создаем массив для хранения цифр дисплея const uint8_t digits[] = {QD_0, QD_1, QD_2, QD_3, QD_4, QD_5, QD_6, QD_7, QD_8, QD_9}; // создаем массив с анимацией ожидания const uint8_t animated[] = {0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b01111111, 0b11111011}; // создаем массив с нотами для стартовой мелодии int startTune[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5}; // создаем массив с длительностями нот для стартовой мелодии int durationStartTune[] = {100, 100, 100, 300, 100, 300}; // создаем массив с нотами для мелодии победы int gameWin[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4}; // создаем массив с длительностями нот для мелодии победы int durationGameWin[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500}; void setup() { // инициализируем дисплей qd.begin(); // инициализируем кноку button.begin(); } void loop() { // запускаем цикл воспроизводящий надпись "Play", которая прерывается нажатием кнопки timer = millis(); buttonFlag = !buttonFlag; while (millis() - timer < CLOCK) { if (buttonFlag) { qd.displayDigits(QD_P, QD_L, QD_A, QD_Y); } else { qd.displayClear(); } // считываем значение кнопки button.read(); // было ли короткое нажатие? if (button.isClick()) { // создаем массив символов для отображения выпавшего числа uint8_t value[] = {QD_NONE, QD_NONE, QD_NONE}; // воспроизводим стартовую мелодию melody(startTune, durationStartTune, sizeof(startTune) / sizeof(int)); // запускаем функцию генерации случайного числа bandit(value); // воспроизводим анимацию cartoon(value); if (value[0] == value[1] && value[1] == value[2] && value[0] == value[2]) { melody(gameWin, durationGameWin, sizeof(gameWin) / sizeof(int)); } else { if (value[0] == value[1] || value[1] == value[2] || value[0] == value[2]) { melody(gameWin, durationGameWin, 4); } } buttonFlag = true; } } } // функция, которая генерирует случайное число void bandit(uint8_t value[]) { randomSeed(analogRead(A3)); // инициализируем последовательность случайных чисел for (int i = 0; i < 3; i++) { // записываем случайные числа в массив value[i] = digits [random(0, 9)]; } } // функция, которая воспроизводит анимацию показа числа на дисплее void cartoon (uint8_t value[]) { for (int j = 0; j <= 4; j++) { for (int i = 0; i < (sizeof (animated) / sizeof(uint8_t)); i++) { timer = millis(); while (millis() - timer < (CLOCK / 20)) { switch (j) { case 0: { qd.displayDigits (animated[i], animated[i], animated[i], QD_NONE); break; } case 1: { qd.displayDigits (value[0], animated[i], animated[i], QD_NONE); break; } case 2: { qd.displayDigits (value[0], value[1], animated[i], QD_NONE); break; } case 3: { qd.displayDigits (value[0], value[1], value[2], QD_NONE); break; } } } } } } // функция воспроизведения мелодий void melody(int melody[], int noteDurations[], int noteCount) { // Играем мелодию for (int thisNote = 0; thisNote < noteCount; thisNote++) { tone(BUZZER, OCTAVE * melody[thisNote]); delay(noteDurations[thisNote]); noTone(BUZZER); } } В программировании достаточно часто находят применение последовательности чисел, выбранных случайным образом из некоторого множества. В качестве примеров задач, в которых используются случайные числа, можно привести следующие: тестирование алгоритмов; имитационное моделирование; некоторые задачи численного анализа; имитация пользовательского ввода. Для получения случайных чисел можно использовать различные способы. В общем случае все методы генерирования случайных чисел можно разделить на аппаратные и программные. Устройства или алгоритмы получения случайных чисел называют генераторами случайных чисел (ГСЧ) или датчиками случайных чисел. Аппаратные ГСЧ представляют собой устройства, преобразующие в цифровую форму какой-либо параметр окружающей среды или физического процесса. Параметр и процесс выбираются таким образом, чтобы обеспечить хорошую «случайность» значений при считывании. Очень часто используются паразитные процессы в электронике (токи утечки, туннельный пробой диодов, цифровой шум видеокамеры, шумы на микрофонном входе звуковой карты и т.п.). Формируемая таким образом последовательность чисел, как правило, носит абсолютно случайный характер и не может быть воспроизведена заново по желанию пользователя. К программным ГСЧ относятся различные алгоритмы генерирования последовательности чисел, которая по своим характеристикам напоминает случайную. Для формирования очередного числа последовательности используются различные алгебраические преобразования. Одним из первых программных ГСЧ является метод средин квадратов, предложенный в 1946 г. Дж. фон Нейманом. Этот ГСЧ формирует следующий элемент последовательности на основе предыдущего путем возведения его в квадрат и выделения средних цифр полученного числа. Например, мы хотим получить 10-значное число и предыдущее число равнялось 5772156649. Возводим его в квадрат и получаем 33317792380594909201; значит, следующим числом будет 7923805949. Очевидным недостатком этого метода является зацикливание в случае, если очередное число будет равно нулю. Кроме того, существуют и другие сравнительно короткие циклы. Любые программные ГСЧ, не использующие внешних «источников энтропии» и формирующие очередное число только алгебраическими преобразованиями, не дают чисто случайных чисел. Последовательность на выходе такого ГСЧ выглядит как случайная, но на самом деле подчиняется некоторому закону и, как правило, рано или поздно зацикливается. Такие числа называются псевдослучайными. В дальнейшем мы будем рассматривать лишь программные генераторы псевдослучайных чисел. Download 231.89 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling