Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

solowey
Статус: 7-й класс
Рейтинг: 173
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 157
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 80
∙ повысить рейтинг »

∙ .NET Framework / C# / Java

Номер выпуска:283
Дата выхода:31.10.2017, 12:45
Администратор рассылки:Коцюрбенко Алексей aka Жерар (Мастер-Эксперт)
Подписчиков / экспертов:20 / 15
Вопросов / ответов:1 / 1

Консультация # 191541: Здравствуйте! Прошу помощи в следующем вопросе: Задание: Написать программу, параллельно вычисляющую значения числа Пи методом Монте-Карло. Общее количество случайных точек для всех параллельных потоков должно задаваться пользователем после запуска программы. Результаты вычислений параллельных участков после их завершения...

Консультация # 191541:

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

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();
        }
    }

Дата отправки: 26.10.2017, 12:34
Вопрос задал: Посетитель - 399158 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует solowey (7-й класс):

Здравствуйте, Посетитель - 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();	// ждем нажатия клавиши
        }
    }

Консультировал: solowey (7-й класс)
Дата отправки: 26.10.2017, 13:30

5
Спасибо большое, очень помогли.)
-----
Дата оценки: 26.10.2017, 14:04

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное