Вперед Зміст

Ініціалізація та вивід вектору на екран

Написати функції:

Використовуючи ці функції написати таку програму:

Результат роботи

Код програми з функціями

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;

// Прототипи функцій
void RandVect(vector<int>& v, int n, int a, int b); // Заповнення вектора
void PrintVect(vector<int> v);                      // Виведення вектора
int FindFirst(vector<int> v);                       // Пошук першого елемента, що задовольняє умову

int main() {
    srand(time(0)); // Ініціалізація генератора випадкових чисел
    
    // Введення параметрів
    int a, b, n;
    cout << "Введіть межі діапазону (a b) та кількість елементів (n): ";
    cin >> a >> b >> n;
    
    vector<int> vect; // Оголошення вектора
    
    RandVect(vect, n, a, b); // Заповнення вектора
    PrintVect(vect);          // Виведення вектора
    
    int ind = FindFirst(vect); // Пошук елемента
    if (ind == -1) {
        cout << "Error: елемент не знайдено";
    } else {
        cout << "Значення: " << vect[ind] << ", Індекс: " << ind;
    }
    
    return 0;
}

// Функція заповнення вектора випадковими числами
void RandVect(vector<int>& v, int n, int a, int b) {
    v.resize(n); // Встановлення розміру вектора
    for (int i = 0; i < n; i++) {
        v[i] = a + rand() % (b - a + 1); // Генерація випадкового числа
    }
}

// Функція виведення вектора
void PrintVect(vector<int> v) {
    cout << "Вектор: ";
    for (int num : v) {
        cout << num << " ";
    }
    cout << endl;
}

// Функція пошуку першого елемента, що задовольняє умову (приклад - перший додатній)
int FindFirst(vector<int> v) {
    for (int i = 0; i < v.size(); i++) {
        if (v[i] > 0) { // Умова для пошуку (у цьому прикладі - перший додатній)
            return i;
        }
    }
    return -1; // Якщо елемент не знайдено
}

Mersenne Twister (mt19937)

#include <iostream>
#include <random>  // Нова бібліотека для генераторів
#include <vector>
using namespace std;

// Прототипи функцій
void RandVect(vector<int>& v, int n, int a, int b);
void PrintVect(vector<int> v);
int FindFirst(vector<int> v);

int main() {
    // Введення параметрів
    int a, b, n;
    cout << "Введіть межі діапазону (a b) та кількість елементів (n): ";
    cin >> a >> b >> n;
    
    vector<int> vect;
    RandVect(vect, n, a, b);
    PrintVect(vect);
    
    int ind = FindFirst(vect);
    if (ind == -1) {
        cout << "Error: елемент не знайдено";
    } else {
        cout << "Значення: " << vect[ind] << ", Індекс: " << ind;
    }
    
    return 0;
}

void RandVect(vector<int>& v, int n, int a, int b) {
    random_device rd;  // Джерело ентропії
    mt19937 gen(rd()); // Генератор Mersenne Twister
    uniform_int_distribution<int> dist(a, b); // Рівномірний розподіл
    
    v.resize(n);
    for (int i = 0; i < n; i++) {
        v[i] = dist(gen);  // Генерація випадкового числа
    }
}

// Інші функції залишаються без змін
void PrintVect(vector<int> v) {
    cout << "Вектор: ";
    for (int num : v) {
        cout << num << " ";
    }
    cout << endl;
}

int FindFirst(vector<int> v) {
    for (int i = 0; i < v.size(); i++) {
        if (v[i] > 0) {
            return i;
        }
    }
    return -1;
}

Різниця між генераторами:

Критерій rand() Mersenne Twister (mt19937)
Якість випадковості Низька, передбачувані послідовності Висока, дуже хороша статистична якість
Період ~32,000 чисел 219937-1 (дуже великий)
Швидкість Швидкий Трохи повільніший, але все ще швидкий
Розподіл Нерівномірний (потрібна нормалізація) Ідеально рівномірний з uniform_int_distribution
Ініціалізація srand(time(0)) random_device + конструктор mt19937
Застосування Прості задачі, де якість не важлива Криптографія, симуляції, наукові розрахунки

Основні переваги Mersenne Twister:

  1. Набагато краща якість випадкових чисел
  2. Набагато довший період перед повторенням
  3. Підтримка різних розподілів (рівномірний, нормальний тощо)
  4. Краща передбачуваність для наукових досліджень

Недоліки:

Вперед Зміст