Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <windows.h>
- #include <stdio.h>
- #include <process.h>
- #include <time.h>
- #include <random>
- using namespace std;
- const int threads = 4;
- int n = 0;
- int k = 0;
- int amount = 0;
- default_random_engine generator;
- uniform_int_distribution<int> distribution(0, 32767);
- //ofstream out("functions.txt");
- //CRITICAL_SECTION cs;
- unsigned int WINAPI ThreadFunction(LPVOID pvParam)
- {
- // выделение памяти
- int* coeffs = new int[n]; // коэффициенты функции
- int* borders = new int[k - 1]; // пороговые значения
- int* vars = new int[n]; // промежуточные значения переменных
- int* values = new int[pow(k, n)]; // столбец значений
- int thread_id = (int)pvParam;
- int index;
- int linear;
- int min;
- int max;
- string filename = "functions";
- filename += (thread_id + '0');
- filename += ".txt";
- ofstream thread_out(filename);
- // инициализация коэффициентов функции
- while (amount > 0)
- {
- amount--;
- min = 0;
- max = 0;
- for (int i = 0; i < n; i++)
- {
- coeffs[i] = (distribution(generator) % 20000) - 10000;
- if (coeffs[i] < 0)
- min += (coeffs[i] * (k - 1));
- else if (coeffs[i] > 0)
- max += (coeffs[i] * (k - 1));
- }
- // инициализация порогов функции
- for (int i = 0; i < k - 1; i++)
- {
- borders[i] = (distribution(generator) % (max - min)) + min;
- for (int j = 0; j < i; j++)
- {
- while (borders[i] == borders[j])
- borders[i] = (distribution(generator) % (max - min)) + min;
- if (borders[j] > borders[i])
- swap(borders[i], borders[j]);
- }
- }
- // вычисление столбца значений
- for (int i = 0; i < pow(k, n); i++)
- {
- index = i;
- linear = 0;
- for (int j = n - 1; j >= 0; j--)
- {
- vars[j] = index % k;
- linear += (vars[j] * coeffs[j]);
- index -= vars[j];
- index /= k;
- }
- values[i] = k - 1;
- for (int j = 0; j < k - 1; j++)
- if (linear < borders[j])
- {
- values[i] = j;
- break;
- }
- thread_out << values[i] << " ";
- }
- thread_out << "\n";
- //EnterCriticalSection(&cs);
- /*for (int i = 0; i < pow(k, n); i++)
- thread_out << values[i] << " ";
- thread_out << "\n";*/
- //amount--;
- //LeaveCriticalSection(&cs);
- }
- delete[] coeffs;
- delete[] borders;
- delete[] vars;
- delete[] values;
- thread_out.close();
- return 0;
- }
- void initialize()
- {
- cout << "n = ";
- cin >> n;
- cout << "k = ";
- cin >> k;
- cout << "amount = ";
- cin >> amount;
- return;
- }
- void writeInfo()
- {
- ofstream out("info.txt");
- out << n << " " << k << " " << amount << " " << threads;
- out.close();
- }
- int main()
- {
- srand(time(NULL));
- int starttime = GetTickCount();
- HANDLE hThreads[threads];
- initialize();
- writeInfo();
- //InitializeCriticalSection(&cs);
- for (int i = 0; i < threads; i++)
- {
- hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, (LPVOID)i, 0, NULL);
- if (hThreads[i] == NULL)
- {
- printf("[x] thread #%d cannot be created, error %d", i, GetLastError());
- return 1;
- }
- }
- WaitForMultipleObjects(threads, hThreads, TRUE, INFINITE);
- //DeleteCriticalSection(&cs);
- printf("program is finished in %d ms\n", (GetTickCount() - starttime));
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement