Консультация № 191541
26.10.2017, 12:34
0.00 руб.
0 3 1
Здравствуйте! Прошу помощи в следующем вопросе:
Задание: Написать программу, параллельно вычисляющую значения числа
Пи методом Монте-Карло. Общее количество случайных точек для
всех параллельных потоков должно задаваться пользователем после
запуска программы. Результаты вычислений параллельных участков
после их завершения должны усредняться. Полученный результат
вывести на экран.
Можете написать что мы и где делаем? комментарии
Код:

class Program
{
static double getDouble(Random rand)
{
return rand.NextDouble();
}

static double GetPiVAlue(int radius, double dots_count)
{
double dotsInCircleCount = 0;
int radius2 = radius * radius;
Random rand = new Random();
for (int i = 0; i < dots_count; i++)
{
double x = getDouble(rand) * radius;
double y = getDouble(rand) * radius;
if ((y * y) + (x * x) <= radius2)
dotsInCircleCount++;
}
return 4.0 * dotsInCircleCount / dots_count;
}

static void Main(string[] args)
{
double pi = 0;
DateTime begin = DateTime.Now;

for (int i = 0; i < 10; i++)
{
pi += GetPiVAlue(1, 70000000);
}
pi /= 10;
DateTime end = DateTime.Now;

Console.WriteLine(end.Subtract(begin));

begin = DateTime.Now;
List<Task<double>> pi_tasks = new List<Task<double>>();

for (int i = 0; i < 10; i++)
{
pi_tasks.Add(Task.Factory.StartNew<double>(() => { return GetPiVAlue(1, 70000000); }));
}

Task finalTask = Task.Factory.ContinueWhenAll(pi_tasks.ToArray(), pi_val => { Console.WriteLine($"{ (pi_val.Sum(val => val.Result)) / (double)pi_val.Count() }"); });
finalTask.Wait();
Console.WriteLine("ccc");
end = DateTime.Now;
Console.WriteLine(end.Subtract(begin));
Console.ReadKey();
}
}

Обсуждение

давно
Советник
400484
472
26.10.2017, 13:30
общий
это ответ
Здравствуйте, Посетитель - 399158!
Код:
    class Program	// класс программы
{
// статическая функция получения рандомного числа
static double getDouble(Random rand)
{
return rand.NextDouble(); // возвращаем рандомное число
}

// статическая функция получения значения числа Пи
static double GetPiVAlue(int radius, double dots_count)
{
double dotsInCircleCount = 0; // точка на окружности
int radius2 = radius * radius; // радиус в квадрате
Random rand = new Random(); // создвние объекта класса для получения рандомного числа
for (int i = 0; i < dots_count; i++) // цикл создания точек на окнужности
{
double x = getDouble(rand) * radius; // получение значения х точки
double y = getDouble(rand) * radius; // получение значения у точки
if ((y * y) + (x * x) <= radius2) // проверяем не вышло ли точка за радиус окружности
dotsInCircleCount++; // увеличиваем число точек на окружности
}
return 4.0 * dotsInCircleCount / dots_count; // возвращаем значение
}

static void Main(string[] args)
{
double pi = 0; // создаем переменную Пи и инициализируем 0
DateTime begin = DateTime.Now; // получаем текущую дату и время
for (int i = 0; i < 10; i++) // цикл получения 10 значений пи
{
pi += GetPiVAlue(1, 70000000); // суммируем полученые значения
}
pi /= 10; // получаем среднее значение для 10 результатов
DateTime end = DateTime.Now; // получаем текущую дату и время
Console.WriteLine(end.Subtract(begin)); // получаем разницу по дате и времени (сколько затратили)

begin = DateTime.Now;// получаем текущую дату и время
List<Task<double>> pi_tasks = new List<Task<double>>(); // создаем список задач
for (int i = 0; i < 10; i++) // цикл создания 10 задач
{
pi_tasks.Add(Task.Factory.StartNew<double>(() => { return GetPiVAlue(1, 70000000); })); // добавляем новую задачу в список
}
Task finalTask = Task.Factory.ContinueWhenAll( // запуск на выполнения всех задач
pi_tasks.ToArray(), // приводим список а массиву
pi_val => { Console.WriteLine($"{ // выводим значение в консоль
(pi_val.Sum(val => val.Result)) // суммируем полученные значения от результатов вычисления
/ (double)pi_val.Count() // делем сумму на количество результатов
}"); });
finalTask.Wait(); // Ожидаем завершения задач

Console.WriteLine("ccc"); // выводим в консоле ccc
end = DateTime.Now; // получаем текущую дату и время
Console.WriteLine(end.Subtract(begin)); // получаем разницу по дате и времени (сколько затратили)
Console.ReadKey(); // ждем нажатия клавиши
}
}
5
Спасибо большое, очень помогли.)
давно
Посетитель
399158
228
28.10.2017, 10:38
общий
а как вывести значение ПИ ил тасков?
давно
Советник
400484
472
29.10.2017, 20:10
общий
значение Пи выводиться
Код:
00:01:19.1380149
3,14161724571429
ccc
00:00:19.2890972
Форма ответа