350 Алгоритми та структури даних

Конспекти лекцій та Лабораторні роботи з дисципліни "Алгоритми та структури даних" для III курсу спеціальності 121 "Інженерія програмного забезпечення" ОКР "Фаховий молодший бакалавр" Херсонського політехнічного фахового коледжу Державного університету "Одеська політехніка"

View the Project on GitHub solidol/nmk-asd

Перелік усіх робіт

Алгоритми рандомізації

Мета роботи

Ознайомитися з основними методами генерації випадкових чисел та послідовностей, вивчити алгоритми рандомізації даних у програмуванні, навчитися створювати та використовувати генератори випадкових чисел у мові C++.

Обладнання

Персональний комп’ютер, IDE Microsoft Visual Studio або інша середа розробки для мови C++.

Теоретичні відомості

Рандомізація — це процес створення випадкових значень, які не мають визначеного закономірного порядку.
У програмуванні вона використовується для:

Основні типи генераторів випадкових чисел

  1. Лінійний конгруентний генератор (LCG)
  2. Mersenne Twister (MT19937)
  3. Xorshift генератор
  4. Crypto RNG (криптографічний генератор)

Алгоритми рандомізації даних

Порівняння генераторів

Генератор Швидкість Якість випадковості Період Застосування
Лінійний конгруентний Висока Середня ~2³¹ Просте тестування
Mersenne Twister Висока Висока 2¹⁹⁹³⁷ Наукові розрахунки
Xorshift Дуже висока Середньо-висока Великий Ігри, симуляції
Random Device Середня Дуже висока Криптографія

Хід роботи

  1. Відкрити Visual Studio → створити новий проєкт Console Application (C++).
  2. Реалізувати генерацію випадкових чисел кількома способами.
  3. Реалізувати Fisher–Yates Shuffle.
  4. Реалізувати вибір елемента з вагами.
  5. Виміряти швидкість роботи кожного генератора.
  6. Вивести результати у форматі:
Generator: mt19937
Range: 1–100
Random numbers: 12 87 55 43 91 14 69
Shuffle: 69 14 91 12 43 87 55
Time: 0.00089 s
  1. Створити таблицю з результатами.
  2. Реалізувати класи RandomGenerator, MersenneGenerator, Timer.
  3. Зробити висновки та зберегти звіт у PDF.

Контрольні запитання

  1. Що таке рандомізація і для чого вона використовується?
  2. Яка різниця між псевдовипадковими та істинно випадковими числами?
  3. У чому суть алгоритму Fisher–Yates Shuffle?
  4. Як працює лінійний конгруентний генератор?
  5. Що таке період генератора і чому він важливий?
  6. Чим відрізняється rand() від std::mt19937?
  7. Як виміряти якість випадковості?
  8. Коли потрібно використовувати криптографічний генератор?
  9. Які параметри впливають на швидкість рандомізації?
  10. У яких галузях застосовуються алгоритми випадкової генерації?

Приклади

  1. Простий генератор rand() C++
  2. Mersenne Twister C++
  3. Fisher–Yates Shuffle C++
  4. Вимірювання часу роботи C++

Додаткові матеріали

  1. [C++ Reference (cppreference.com)](https://en.cppreference.com/w/cpp/header/random)
  2. Mersenne Twister Explained (Wikipedia)
  3. Fisher–Yates Shuffle Algorithm