#include <iostream>
#include <fstream>
#include <vector>
#include <chrono>
using namespace std;
// Лінійний конгруентний метод
class LCG {
private:
unsigned long long a, c, m, seed;
public:
LCG(unsigned long long a, unsigned long long c, unsigned long long m, unsigned long long seed)
: a(a), c(c), m(m), seed(seed) {}
unsigned long long next() {
seed = (a * seed + c) % m;
return seed;
}
};
// Функція для генерації та запису випадкових чисел у файл
void generateNumbers(const string& filename, LCG& generator, int count) {
ofstream outFile(filename);
if (!outFile) {
cerr << "Помилка відкриття файлу!" << endl;
return;
}
for (int i = 0; i < count; i++) {
outFile << generator.next() << endl;
}
outFile.close();
cout << "Числа успішно збережені у файлі: " << filename << endl;
}
// Функція для вимірювання часу виконання генерації
void testPerformance(LCG& generator, int count) {
auto start = chrono::high_resolution_clock::now();
for (int i = 0; i < count; i++) {
generator.next();
}
auto end = chrono::high_resolution_clock::now();
chrono::duration<double> duration = end - start;
cout << "Час генерації " << count << " чисел: " << duration.count() << " секунд" << endl;
}
int main() {
// Параметри для LCG: стандартні значення (GNU GCC LCG)
unsigned long long a = 1664525;
unsigned long long c = 1013904223;
unsigned long long m = 4294967296; // 2^32
unsigned long long seed = 12345; // Початкове значення
LCG generator(a, c, m, seed);
int numSamples = 10000; // Кількість випадкових чисел
// Генерація випадкових чисел і запис у файл
generateNumbers("random_numbers.txt", generator, numSamples);
// Тестування продуктивності
testPerformance(generator, numSamples);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNocm9ubz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyDQm9GW0L3RltC50L3QuNC5INC60L7QvdCz0YDRg9C10L3RgtC90LjQuSDQvNC10YLQvtC0CmNsYXNzIExDRyB7CnByaXZhdGU6CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgYSwgYywgbSwgc2VlZDsKCnB1YmxpYzoKICAgIExDRyh1bnNpZ25lZCBsb25nIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBsb25nIGMsIHVuc2lnbmVkIGxvbmcgbG9uZyBtLCB1bnNpZ25lZCBsb25nIGxvbmcgc2VlZCkKICAgICAgICA6IGEoYSksIGMoYyksIG0obSksIHNlZWQoc2VlZCkge30KCiAgICB1bnNpZ25lZCBsb25nIGxvbmcgbmV4dCgpIHsKICAgICAgICBzZWVkID0gKGEgKiBzZWVkICsgYykgJSBtOwogICAgICAgIHJldHVybiBzZWVkOwogICAgfQp9OwoKLy8g0KTRg9C90LrRhtGW0Y8g0LTQu9GPINCz0LXQvdC10YDQsNGG0ZbRlyDRgtCwINC30LDQv9C40YHRgyDQstC40L/QsNC00LrQvtCy0LjRhSDRh9C40YHQtdC7INGDINGE0LDQudC7CnZvaWQgZ2VuZXJhdGVOdW1iZXJzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIExDRyYgZ2VuZXJhdG9yLCBpbnQgY291bnQpIHsKICAgIG9mc3RyZWFtIG91dEZpbGUoZmlsZW5hbWUpOwogICAgaWYgKCFvdXRGaWxlKSB7CiAgICAgICAgY2VyciA8PCAi0J/QvtC80LjQu9C60LAg0LLRltC00LrRgNC40YLRgtGPINGE0LDQudC70YMhIiA8PCBlbmRsOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICBvdXRGaWxlIDw8IGdlbmVyYXRvci5uZXh0KCkgPDwgZW5kbDsKICAgIH0KCiAgICBvdXRGaWxlLmNsb3NlKCk7CiAgICBjb3V0IDw8ICLQp9C40YHQu9CwINGD0YHQv9GW0YjQvdC+INC30LHQtdGA0LXQttC10L3RliDRgyDRhNCw0LnQu9GWOiAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7Cn0KCi8vINCk0YPQvdC60YbRltGPINC00LvRjyDQstC40LzRltGA0Y7QstCw0L3QvdGPINGH0LDRgdGDINCy0LjQutC+0L3QsNC90L3RjyDQs9C10L3QtdGA0LDRhtGW0ZcKdm9pZCB0ZXN0UGVyZm9ybWFuY2UoTENHJiBnZW5lcmF0b3IsIGludCBjb3VudCkgewogICAgYXV0byBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgZ2VuZXJhdG9yLm5leHQoKTsKICAgIH0KCiAgICBhdXRvIGVuZCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OwoKICAgIGNvdXQgPDwgItCn0LDRgSDQs9C10L3QtdGA0LDRhtGW0ZcgIiA8PCBjb3VudCA8PCAiINGH0LjRgdC10Ls6ICIgPDwgZHVyYXRpb24uY291bnQoKSA8PCAiINGB0LXQutGD0L3QtCIgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7CiAgICAvLyDQn9Cw0YDQsNC80LXRgtGA0Lgg0LTQu9GPIExDRzog0YHRgtCw0L3QtNCw0YDRgtC90ZYg0LfQvdCw0YfQtdC90L3RjyAoR05VIEdDQyBMQ0cpCiAgICB1bnNpZ25lZCBsb25nIGxvbmcgYSA9IDE2NjQ1MjU7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgYyA9IDEwMTM5MDQyMjM7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgbSA9IDQyOTQ5NjcyOTY7IC8vIDJeMzIKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzZWVkID0gMTIzNDU7ICAvLyDQn9C+0YfQsNGC0LrQvtCy0LUg0LfQvdCw0YfQtdC90L3RjwoKICAgIExDRyBnZW5lcmF0b3IoYSwgYywgbSwgc2VlZCk7CgogICAgaW50IG51bVNhbXBsZXMgPSAxMDAwMDsgLy8g0JrRltC70YzQutGW0YHRgtGMINCy0LjQv9Cw0LTQutC+0LLQuNGFINGH0LjRgdC10LsKCiAgICAvLyDQk9C10L3QtdGA0LDRhtGW0Y8g0LLQuNC/0LDQtNC60L7QstC40YUg0YfQuNGB0LXQuyDRliDQt9Cw0L/QuNGBINGDINGE0LDQudC7CiAgICBnZW5lcmF0ZU51bWJlcnMoInJhbmRvbV9udW1iZXJzLnR4dCIsIGdlbmVyYXRvciwgbnVtU2FtcGxlcyk7CgogICAgLy8g0KLQtdGB0YLRg9Cy0LDQvdC90Y8g0L/RgNC+0LTRg9C60YLQuNCy0L3QvtGB0YLRlgogICAgdGVzdFBlcmZvcm1hbmNlKGdlbmVyYXRvciwgbnVtU2FtcGxlcyk7CgogICAgcmV0dXJuIDA7Cn0K