Урок второй: давайте играть в азартные игры!
То, что мы на самом деле собираемся делать сегодня, — это применить метод, называемый «методом Монте-Карло», чтобы оценить значение Π, которое является греческой буквой «пи». (Вы произносите это на английском языке с тем же произношением, что и «пирог», поэтому, когда кто-то говорит: «Это так же просто, как пирог!», Они имеют в виду, что «это так же просто, как отношение длины окружности любого круга к его диаметру»). »Или, может быть,« это так же просто, как отношение площади круга к квадрату его радиуса ». Разве это не звучит так просто, если вы так говорите, не так ли?)
Мы использовали много аккуратного (и нового) условия там. Во-первых, давайте вернемся к началу и определим вещи.
Круг — это фигура, чертеж, составленный из всех точек, которые находятся на одинаковом расстоянии от другой точки. Другими словами, если вы бросили дротик в стену, а затем нарисовали много точек, которые были точно в двух дюймах от того места, где этот дротик попал в стену, у вас получилось бы нечто, похожее на круг. (Теоретически, невозможно создать идеальный круг, потому что нет способа нарисовать каждую возможную точку на круге.)
Окружность окружности — это измерение длины линии, составленной из точек окружности. Другими словами, если бы вы измерили количество пространства на кривой круга, у вас была бы окружность круга.
Диаметр круга — это измерение расстояния между любыми двумя точками на противоположных концах круга, другими словами, как далеко проходит круг. Радиус круга составляет половину этого расстояния. Если радиус равен r, диаметр (d) всегда равен 2r. (Если это не так, то у вас нет круга! Трудно сказать, что вы на самом деле имеете, но «круг» не так.)
Мы уже покрыли квадраты, но «квадрат» числа является результатом того, что само число умножается на «два квадрата» — четыре, три квадрата — девять, четыре квадрата — шестнадцать и т. Д. («Квадратный корень» Другой способ: квадратный корень из шестнадцати — это четыре, квадратный корень из девяти — это три, квадратный корень из четырех — это два, квадратный корень из двух, очевидно, — и примерно — 1.41421356.)
Теперь, когда мы можем с большой долей точности притвориться, что знаем, что такое круг («Он круглый, верно?»), Мы можем перейти к более забавным вещам.
Мы заботимся о пи, потому что это … это … учителя часто его используют. На самом деле, это довольно странное число, потому что в физике оно проявляется совсем немного. Почистите реальность достаточно, чтобы добраться до математики под ней, и вы найдете пи1, скрывающийся далеко под поверхностью. Глядя на Эйнштейна? Пи появляется. Гейзенберг? Пи там, убедившись, что мы не уверены. Кулон? Kepler? Пи появляется в их самых важных работах.
Все это не имеет отношения к тому, что мы пытаемся сделать сегодня.
Все, что мы хотим сделать сегодня, это определить число Пи в определенном диапазоне. На самом деле мы не можем работать с пи все время, потому что одна из странностей пи — это то, что он иррациональный, что означает, что он продолжается вечно. Пи был разработан более чем на триллион цифр. Можно с уверенностью предположить, что после этого это будет продолжаться еще несколько триллионов. Через некоторое время вы получаете настолько большую точность, что это не имеет значения — например, согласно Википедии, значение пи, усеченное до тридцати девяти десятичных знаков, достаточно для вычисления окружности любого круга, который вписывается в наблюдаемую вселенную, чтобы точность, сопоставимая с размером атома водорода. Это … удивительно точно, если не сказать больше.
Мы можем, однако, подделать пи с достаточной точностью, чтобы сделать нас счастливыми, и в процессе мы узнаем много нового о симуляциях.
«Метод Монте-Карло» — это один из способов, с помощью которых мы можем оценить, какова величина пи. Один из способов объяснить это состоит в том, что если вы нарисовали квадрат на земле, а затем круг, максимально большой в этом квадрате, и, наконец, разбросали в нем точки равномерно, то число точек в круге, умноженное на четыре , поделенное на количество точек в квадрате, будет становиться все ближе и ближе к пи с увеличением числа точек.
Вау. Это было почти — почти — так же ясно, как грязь.
Прежде всего, очень важно, чтобы мы помнили нашу теорему Пифагора с первого урока. Мы используем это, чтобы определить расстояние от точки A до точки B: расстояние между A и B, выраженное как C, можно выразить так:
мы даже написали некоторый Python, чтобы помочь нам определить длину гипотенузы — c в уравнение. Мы будем повторно использовать этот код.
Теперь, во-первых, нам нужно разработать процесс определения числа пи.
Нам нужен наш triangle.py из прошлого урока, который выглядел так:
import math
def hypotenuse(a, b):
return math.sqrt(math.pow(a,2)+math.pow(b,2))
Нам также нужно будет импортировать другой модуль, который называется «random». Этот модуль Python используется для генерации псевдослучайных чисел, как вы уже догадались по названию.
Хлоп! Что означает «псевдослучайный»? Что ж, давайте потратим немного времени на то, что такое случайность, чтобы мы поняли, о чем мы.
Случайность — это качество непредсказуемости. Это означает, что если мы говорим «дайте нам случайное число от одного до десяти», мы ожидаем, что мы не сможем угадать, каков будет результат (более, скажем, в десять процентов случаев — мы будем прямо в какой-то момент!)
Тем не менее, случайность имеет некоторые странные свойства, которые не кажутся очевидными на первый взгляд. Например, рассмотрим эту последовательность чисел от одного до десяти: 9, 9, 9, 9, 9, 9. Она не выглядит случайной — выглядит как последовательность из девяток, снова и снова. Справедливо будет сказать, что если предположить, что эта схема справедлива, она не случайна — но это может быть! В конце концов, если мы определяем «случайный» как неспособный дать нам тот же результат, что и предыдущий запрос, мы ограничиваем случайность!
Существуют способы определения фактической случайности, но они включают в себя довольно много работы, и в конце их, с точки зрения наблюдателя, вы все еще не можете быть уверены, что они случайны. (Ого, я думаю, что мы только что перефразировали Гейзенберга, окольным, расплывчатым, случайным образом.)
Компьютеры вообще ужасны при истинной случайности. Большинство «генераторов случайных чисел» для языков программирования используют то, что называется «начальным числом», способом генерации начального случайного числа, например, на основе текущего времени или чего-то подобного, и затем изменением этого начального числа как нового случайного числа. номера генерируются. Если вы знаете, что семя используется, вы можете предсказать, какие случайные числа будут сгенерированы.
Это звучит как приглашение к коду. Мы очень много говорили о математике: давайте возьмем некоторые, чтобы мы могли показать нашу случайность — или ее отсутствие.
$ python
Python 2.5.1 (r251:54863, May 18 2007, 16:56:43)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> random.seed(5)
>>> for x in range(5):
... print random.random()
... [Return]
0.62290169489
0.741786989261
0.795193565566
0.942450283777
0.73989857474
>>> random.seed(5)
>>> for x in range(5):
... print random.random()
... [Return]
0.62290169489
0.741786989261
0.795193565566
0.942450283777
0.73989857474
>>> [CTRL-D]
Как обычно, несколько замечаний.
Нам все еще нужно «импортировать случайные данные», потому что это модуль Python, и мы должны сообщить Python, что планируем его использовать. Нас интересуют два метода в «случайном» модуле: метод random.seed () и метод random.random ().
Первый — random.seed () — позволяет нам установить начальное значение для определенного числа. Обычно это вообще не нужно называть, но одна из особенностей случайности — непредсказуемость, и мы здесь показываем, что случайность не так уж и случайна!
Установив начальное значение, мы можем гарантировать предсказуемость, что означает, что мы можем запускать тесты снова и снова, не беспокоясь о том, что результаты наших тестов меняются из-за изменения наших источников чисел.
Второй вызов — random.random () — дает нам число от 0,0 до 1,0. Документация Python говорит именно об этом, что немного разочаровывает — большинство генераторов случайных чисел дают нам число в диапазоне, такое, что 0.0 является частью диапазона, а 1.0 — нет. Нормальный способ увидеть это «0.0? случайный <1,0 », где строка под« <»означает« меньше или равно », а« <»без подчеркивания означает« меньше чем ». Основываясь на документации по Python, я не уверен, что random.random () может на самом деле генерировать «1.0» в результате, и у меня есть ощущение, что я мог бы протестировать довольно долго, прежде чем получить, так сказать, случайное число.
Следующая странная вещь — бит «for x in range (5):». Это управляющая структура, которая говорит что-то вроде этого: «присвойте х каждому числу от 0 до 5» — и, поскольку мы потратили время на указание диапазонов для генераторов случайных чисел, давайте использовать наши новые знания: х будет в следующем диапазон: 0? случайный <5. (Чтобы быть конкретным: 0,1,2,3,4 будут значения х.)
Теперь просто присвоить x эти числа — все хорошо, но двоеточие в выражении означает, что значение x можно использовать в «блоке», в данном случае «print random.random ()» в примере кода.
Несмотря на все это, запуск блоков дважды должен показать нам те же самые результаты — если бы мы смотрели на действительно генератор случайных чисел, мы не смогли бы получить это.
Так как это влияет на наш пи? Ну … проблема здесь в том, что фактическая оценка числа пи зависит от случайности. Хорошая часть этого. Мы можем приблизиться, но мы должны помнить, что это оценка числа пи, и она не близка к фактическому значению. Мы можем получить число, которое очень очень очень далеко от фактического значения числа пи — или очень близко. Это будет немного случайно, так сказать.
Давайте просто скажем, что методы Монте-Карло хороши для некоторых вещей, но это урок по симуляции и оценкам — и вычисление числа Пи с помощью Монте-Карло весело, но не надежно.
Интересно, однако, что на четырех страницах мы готовы оценить число пи! Более того, со всеми этими полезными знаниями под нашими поясами (или поясами, или одеждами, или … что-у-тебя) сделать реальную оценку действительно просто!
Помните, мы описали метод Монте-Карло для числа «пи»: «если вы нарисовали квадрат на земле, а затем круг как можно большего размера в этом квадрате и, наконец, разбросали в нем точки равномерно, то количество точек в круге если бы умножить на четыре, разделить на количество точек в квадрате, становилось бы все ближе и ближе к пи с увеличением числа точек ».
Мы также сказали, что это почти так же ясно, как грязь. Давайте напишем некоторый код, чтобы сделать его более понятным — код для запуска всего метода Монте-Карло на самом деле короче объяснения!
Помните, нам нужен наш triangle.py из первого урока:
import math
def hypotenuse(a, b):
return math.sqrt(math.pow(a,2)+math.pow(b,2))
Наш скрипт montecarlo.py, сначала попробуйте:
import triangle
import random
total=0
incircle=0
random.seed(5)
while total<1000:
if(triangle.hypotenuse(random.random(), random.random())<=1):
incircle=incircle+1
total=total+1;
print (incircle*4.0)/total
Давайте посмотрим на этого щенка в действии:
$ python montecarlopi.py
3.128
Это не совсем 3.14159 … но вроде как близко! (Для различных определений «своего рода» и «близко». Даже 22/7 — плохое приближение числа пи, действительно — составляет 3,1428.)
Тем не менее, если мы возьмем эту «1000» в коде, что означает «взять 1000 выборок» и увеличить ее, мы получим все более и более точный результат. Изменение на 100000 вместо 1000 дает нам значение 3,14024 — все еще не так хорошо, как хотелось бы, но мы уже более точны, чем 22/7!
По сути, чем выше и выше мы идем в нашем отсчете выборки, тем лучше будет наш результат числа Пи. Это слабость метода Монте-Карло, но он также учит нас частоте сэмплов — в математике, как и в музыке, больше сэмплов дают нам лучшие данные. Это не идеально — использование 10000000 образцов дает нам результат 3.1413076 — но вы можете видеть, что мы все ближе, ближе и ближе.
Прикольные вещи!