Рассчитать PI, используя случайные числа ⇐ Python

Программы на Python
Anonymous
Рассчитать PI, используя случайные числа

Сообщение Anonymous »

Возникла проблема со следующим вопросом:

В геометрии отношение длины окружности к ее диаметру называется π. Величину π можно оценить из бесконечного ряда вида:

π/4 = 1 – (1/3) + (1/5) – (1 /7) + (1/9) - (1/11) + ...
Существует еще один новый подход к вычислению π. Представьте, что у вас есть доска для дартса площадью 2 квадрата. Он вписывает круг единичного радиуса. Центр круга совпадает с центром квадрата. Теперь представьте, что вы случайным образом бросаете дротики в эту доску для дартса. Тогда отношение количества дротиков, попавших в круг, к общему количеству брошенных дротиков будет таким же, как отношение площади круга к площади квадратной доски для дартса. Площадь круга с единичным радиусом равна всего π квадратной единице. Площадь дартса составляет 4 квадратных единицы. Отношение площади круга к площади квадрата равно π/4.

Для имитации метания дротиков воспользуемся генератором случайных чисел. Модуль Random имеет несколько функций генерации случайных чисел, которые можно использовать. Например, функция Uniform(a, b) возвращает случайное число с плавающей запятой в диапазоне a (включительно) и b (исключительно).

Представьте, что квадратный дротик К доске прикреплена система координат. Верхний правый угол имеет координаты ( 1.0, 1.0), а нижний левый угол — координаты ( -1.0, -1.0 ). Его стороны имеют длину 2 единицы, а его центр (как и центр вписанного круга) находится в начале координат.

Случайная точка внутри дартса может быть задано его координатами x и y. Эти значения генерируются с помощью генератора случайных чисел. Мы достигаем этого следующим образом:

Код: Выделить всё

xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)
Чтобы определить, находится ли точка внутри круга, ее расстояние от центра круга должно быть строго меньше радиуса круга. Расстояние точки с координатами ( xPos, yPos ) от центра равно math.hypot (xPos, yPos). Радиус круга равен 1 единице.

Программа, которую вы будете писать, будет называться CalculatePI. Он будет иметь следующую структуру:

Код: Выделить всё

import math
import random

def computePI ( numThrows ):
...

def main ():
...

main()
Ваша функция main() будет вызывать функцию ComputePI() для заданного количества бросков. Функция ComputePI() имитирует бросок дротика, генерируя случайные числа для координат x и y. Вы определите, находится ли случайно сгенерированная точка внутри круга или нет. Вы сделаете это столько раз, сколько указано в количестве бросков. Вы будете вести подсчет количества раз, когда дротик попадет в круг. Это количество, разделенное на общее количество бросков, составляет отношение π/4. Функция ComputePI() затем вернет вычисленное значение PI.
В вашей функции main() вы хотите поэкспериментировать и посмотреть, увеличивается ли точность PI с увеличением количества бросков на мишени. Вы сравните свой результат со значением, заданным math.pi. Количественная разница в выходных данных — это рассчитанное вами значение PI минус math.pi. Для проведения эксперимента используйте следующее количество бросков: 100, 1000, 10 000, 100 000, 1 000 000 и 10 000 000. Вы вызовете функцию ComputePI(), используя эти числа в качестве входных параметров. Ваши выходные данные будут аналогичны приведенным ниже, т. е. фактические значения рассчитанного PI и разницы будут отличаться, но близки к показанным:

Код: Выделить всё

Computation of PI using Random Numbers

num = 100        Calculated PI = 3.320000   Difference = +0.178407
num = 1000       Calculated PI = 3.080000   Difference = -0.061593
num = 10000      Calculated PI = 3.120400   Difference = -0.021193
num = 100000     Calculated PI = 3.144720   Difference = +0.003127
num = 1000000    Calculated PI = 3.142588   Difference = +0.000995
num = 10000000   Calculated PI = 3.141796   Difference = +0.000204

Difference = Calculated PI - math.pi
Вывод должен быть в указанном выше формате. Количество бросков должно быть оправдано. Рассчитанное значение π и разность должны быть выражены с точностью до шести знаков после запятой. На разнице должен быть знак плюс или минус. Прочтите соответствующие разделы книги по форматированию.

На данный момент я сделал:

Код: Выделить всё

import math
import random

def computePI (numThrows):

xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)

in_circle = 0
throws = 0

while (throws < numThrows):
if math.hypot (xPos, yPos) 

Подробнее здесь: [url]https://stackoverflow.com/questions/46751718/calculate-pi-using-random-numbers[/url]

Вернуться в «Python»