В следующих задачах понадобится функция random из модуля random.

Функция random() не имеет параметров, при каждом следующем вызове даёт в ответе новое действительное число в интервале от 0 до 1. Если вызывать эту функцию очень много раз, то выпавшие числа равномерно заполнят этот интервал.

Для использования функции random необходимо подключить её из библиотеки в начале программы, что делается командой

from random import random

После этого функцию random можно вызывать следующим образом:

from random import random
n = 10
for i in rande(n):
    x = random()
    print(x)

Вычисляем число π

В квадрат вписали окружность и кинули N случайных точек. Какая часть точек окажется внутри окружности?

Можно предположить, что при большом числе точек число попаданий в круг будет пропорционально отношению площадей круга и квадрата. Чтобы разобраться, так ли это, проведём много экспериментов и сравним получившиеся результаты.

A: Кидаем точки в круг (один эксперимент)

Нарисуйте квадрат, окружность и N случайных точек. Если точки попадают внутрь окружности, отображайте их зелёным цветом, а если нет — красным.

Для рисования можно использовать модуль drawzero. Чтобы точка была видна, рисуйте круг радиусом 3 пикселя с центром в точке со случайными координатами.

Посчитайте, какая доля точек попала внутрь круга.

Проведите несколько экспериментов. Всегда ли получается одинаковый результат?

Пример программы, рисующей фигуры с помощью модуля tkinter:
from tkinter import *

w = 1000
h = 1000
x1 = 100
y1 = 100
x2 = 600
y2 = 400
x3 = 700
y3 = 800
window = Tk() 
# Создаётся окно
draw = Canvas(window, width=w, height=h, bg='lightblue') 
# Создаётся холст для рисования с заданными размерами
draw.pack()
# Холст размещается в окне (без этой инструкции мы его не увидим)
draw.create_rectangle(x1, y1, x2, y2, fill='blue', width=0)
# Задаются координаты двух противоположных углов прямоугольника
draw.create_oval(x1, y1, x3, y3, fill='red', width=0)
# Задаются углы прямоугольника, в который вписан овал
draw.create_polygon((x1, y1), (x2, y2), (x3, y3), fill='orange')
# многоугольник (в этой задаче не нужен)
draw.create_line(x1, y1, x2, y3, fill='purple', width=3)
# отрезок (в этой задаче не нужен)
window.mainloop() 
# Этот метод выводит окно на экран, он должен стоять последним в программе
            

B: Доля точек, попавших в круг

Нам нужно будет провести много экспериментов для N случайных точек (рисовать точки уже не надо!). Для этого скопируйте предыдущую программу в новый файл и переделайте её в функцию experiment, которая получает на вход число точек, вычисляет случайные координаты и проверяет, попадут ли точки с этими координатами в круг. Функция должна давать в ответе отношение числа точек, попавших в круг, к общему числу точек.

Функция experiment даёт в ответе одно число и ничего не рисует.

Вызов функции для тестирования:
from random import seed as set_seed, random

set_seed(0)


def experiment(N):
    # тело функции


N = int(input())
M = int(input())
for i in range(M):
    print(experiment(N))

BA: Как распределяются результаты многих экспериментов? - 1

Если провести много экспериментов, их результаты будут различаться. Нас интересует, как распределяются эти результаты на отрезке от 0 до 1. Разделим отрезок [0, 1] на K частей, проведём М экспериментов и посчитаем, результаты скольких экспериментов попали в каждую часть.

Для этого нужно создать дополнительный список count, каждый элемент которого — счётчик, соответствующий одному из K интервалов. После того, как проведён очередной экспериммент, программа должна определять, в какой из K интервалов попадает результат эксперимента и увеличивать на 1 соответствующий интервалу счётчик.

Программа получает на вход три числа: N (число точек), K (число интервалов), М (число экспериментов, М >> K) и печатает через пробел, сколько результатов попало в каждый из K интервалов (то есть значения элементов списка count).

C: Рисуем гистограмму - 1

Напишите функцию draw_histogram, которая получает на вход список count и строит по нему гистограмму: рисует в ряд К прямоугольников, высота каждого из которых пропорциональна соответствующему элементу списка. Подберите высоту прямоугольников так, чтобы самый высокий имел высоту окна. Эта функция пригодится вам в следующих задачах.

Используя функцию draw_histogram, изобразите графически результат работы программы из предыдущей задачи.

Подставляя разные параметры, выясните, как меняется вид гистограммы с увеличением числа экспериментов, и как меняется вид гистограммы с увеличением числа точек.

Программа получает на вход три числа: N (число точек), K (число интервалов), М (число экспериментов, М >> K) и рисует на отрезке [0, 1] K прямоугольников, каждый с высотой, пропорциональной числу экспериментов, результаты которых попали в соответствующий интервал (то есть значениям элементов списка count).

D: Вычисляем число π

Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если точек будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.

Программа получает на вход два числа: N — число точек и М — число экспериментов, усредняет полученные значения и вычисляет приблизительное значеник числа π.

Дополнительный список использовать не нужно.

Вычисляем вероятность

На окружности поставили три случайные точки и построили треугольник с вершинами в этих точках. Какова вероятность того, что центр окружности лежит внутри треугольника?

Предположим, что вероятность можно получить, разделив число благоприятных случаев на их общее число. Но результаты разных экспериментов могут отличаться друг от друга. Проведём много экспериментов и посмотрим, как распределяются их значения.

E: Случайные треугольники, вписанные в окружность

Нарисуйте окружность. Постройте N треугольников со случайными вершинами. Тупоугольные треугольники рисуйте с красными контурами, а остроугольные — с зелёными. (При использовании модуля tkinter треугольники нужно рисовать с помощью отрезков.)

Чтобы точки на окружности располагались случайно, выбирайте случайный угол (от 0 до 360 градусов или от 0 до 2π радиан). Для вычисления декартовых координат точки на окружности нужно использовать функции sin и cos из библиотеки math(x0 и y0 — координаты центра окружности, формулы написаны для случайного угла angle в градусах):

from math import sin, cos, pi
...
x = x0 + R * cos(angle * pi / 180)
y = y0 + R * sin(angle * pi / 180)

Чтобы определить вид получившегося треугольника, можно 1) посчитать по теореме Пифагора квадраты длин его сторон (корни вычислять не нужно!), 2) вычислить углы треугольника, используя теорему о вписанных углах. Выберите любой способ.

Посчитайте отношение числа получившихся остроугольных и тупоугольных треугольников к общему числу треугольников.

EA: Доля остроугольных треугольников

Нам нужно будет провести много экспериментов для N случайных треугольников (рисовать их уже не надо!). Для этого скопируйте предыдущую программу в новый файл и переделайте её в функцию experiment, которая получает на вход число треугольников, вычисляет случайные точки на окружности и определяет по ним вид каждого треугольника. Функция даёт в ответе одно число — отношение числа остроугольных треугольников к их общему количеству (и ничего не рисует).

Вызов функции для тестирования:
from random import seed as set_seed, random
            
set_seed(0)
            
            
def experiment(N):
    # тело функции
            
                
N = int(input())
M = int(input())
for i in range(M):
    print(experiment(N))
            

F: Как распределяются результаты многих экспериментов — 2

Если провести много экспериментов, их результаты будут различаться. Нас интересует, как распределяются эти результаты на отрезке от 0 до 1. Разделим отрезок [0, 1] на K частей, проведём М экспериментов и посчитаем, результаты скольких экспериментов попали в каждую часть.

Для этого нужно создать дополнительный список count, каждый элемент которого — счётчик, соответствующий одному из K интервалов. После того, как проведён очередной экспериммент, программа должна определять, в какой из K интервалов попадает результат эксперимента и увеличивать на 1 соответствующий интервалу счётчик.

Программа получает на вход три числа: N (число треугольников), K (число интервалов), М (число экспериментов, М >> K) и печатает через пробел, сколько результатов попало в каждый из K интервалов (то есть значения элементов списка count).

FA: Рисуем гистограмму — 2

Используя функцию draw_histogram из задачи C, изобразите графически результат работы программы из предыдущей задачи.

Подставляя разные параметры, выясните, как меняется вид гистограммы с увеличением числа экспериментов, и как меняется вид гистограммы с увеличением числа треугольников.

Программа получает на вход три числа: N (число треугольников), K (число интервалов), М (число экспериментов, М >> K) и рисует на отрезке [0, 1] K прямоугольников, каждый с высотой, пропорциональной числу экспериментов, результаты которых попали в соответствующий интервал (то есть значениям элементов списка count).

FB: Вычисляем вероятность, усредняя результаты экспериментов

Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если треугольников будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.

Программа получает на вход два числа: N — число треугольников и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи EA. Программа усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что центр окружности принадлежит случайному вписанному треугольнику.

Дополнительный список использовать не нужно.

Парадокс Бертрана

Рассмотрим правильный треугольник, вписанный в окружность. Наудачу выбирается хорда окружности. Какова вероятность того, что выбранная хорда длиннее стороны треугольника?

Как наудачу выбрать хорду? Возможны следующие варианты:

1) Выбираем две случайные точки на окружности.

2) Выбираем случайный радиус, берём на нём случайную точку и проводим хорду, перпендикулярную радиусу.

3) Ставим случайную точку внутри круга и строим хорду с центром в выбранной точке.

И вы уже догадались, что результата одного эксперимента (даже при большом числе хорд) будет не достаточно.

G: Хорды со случайными концами

Напишите программу, которая рисует окружность и вписанный в неё равносторонний треугольник. Потом выбирает на окружности N пар случайных точек и рисует N случайных хорд с концами в этих точках. Хорды, которые длиннее стороны треугольника, рисуйте зелёным цветом, а остальные — красным.

Как вычислить координаты случайных точек на окружности, подробно написано в задаче Е.

Вычислите отношение числа хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд.

GA: Доля случайных хорд длиннее стороны вписанного треугольника — 1

Нам нужно будет провести много экспериментов для N случайных хорд. Для этого скопируйте предыдущую программу (задача G) в новый файл и переделайте её в функцию experiment, которая получает на вход число хорд, вычисляет случайные концы хорд на окружности и определяет длину каждой хорды. Функция даёт в ответе одно число — отношение числа хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд (и ничего не рисует).

Вызов функции для тестирования:
from random import seed as set_seed, random
from math import sin, cos, pi
            
set_seed(0)
            
            
def experiment(N):
    # тело функции
            
                
N = int(input())
M = int(input())
for i in range(M):
    print(experiment(N))
                

GB: Вычисляем вероятность — 1

Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если хорд будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.

Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи GA. Программа усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.

Дополнительный список использовать не нужно.

H: Хорды, перпендикулярные случайному радиусу

Напишите программу, которая рисует окружность и вписанный в неё равносторонний треугольник. Потом N раз выбирает случайный радиус (то есть угол от 0 до 360 градусов или от 0 до 2π радиан), берёт на нём случайную точку (то есть выбирает случайное расстояние от центра окружности до хорды) и проводит хорду, перпендикулярную радиусу (радиус, перпендикулярный хорде, проходит через её центр).

Сначала выберем случайное расстояние и найдём параметры равнобедренного треугольника, ограниченного получившейся хордой и двумя радиусами (треугольник ADE на рисунке ниже).

AC = R * cos(DAC), но нам нужно, наоборот, по случайному расстоянию АС вычислить угол DAC. Для этого воспользуемся функцией, обратной косинусу — она называется арккосинус (функция acos из модуля math). Аргумент этой функции обязательно должен быть по модулю меньше 1, а результат — величина угла в радианах.

angle_DAC = acos(AC / R)

Теперь выберем случайный радиус — угол angle от 0 до 2π. Концы хорды отстоят от него на углы +acos(AC/R) и -acos(AC/R), их координаты можно вычислить по формуле:

x1 = x0 + R * cos(angle + acos(AC / R))
y1 = y0 + R * sin(angle + acos(AC / R))
x2 = x0 + R * cos(angle - acos(AC / R))
y2 = y0 + R * sin(angle - acos(AC / R))

Хорды, которые длиннее стороны треугольника, рисуйте зелёным цветом, а остальные — красным.

Вычислите отношение числа хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд.

HA: Доля случайных хорд длиннее стороны вписанного треугольника — 2

Нам нужно будет провести много экспериментов для N случайных хорд. Для этого скопируйте предыдущую программу (задача H) в новый файл и переделайте её в функцию experiment, которая получает на вход число хорд, вычисляет случайное расстояние от центра окружности и случайный угол наклона перпендикулярного хорде радиуса, находит по ним концы хорд и определяет длину каждой хорды.

Функция даёт в ответе одно число — отношение числа случайных хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд (и ничего не рисует).

Вызов функции для тестирования:
from random import seed as set_seed, random
from math import sin, cos, pi, acos
            
set_seed(0)
            
            
def experiment(N):
    # тело функции
            
                
N = int(input())
M = int(input())
for i in range(M):
    print(experiment(N))
                

HB: Вычисляем вероятность — 2

Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи HA. Программа усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.

Дополнительный список использовать не нужно.

I: Хорды c центром в случайной точке

Напишите программу, которая рисует окружность и вписанный в неё равносторонний треугольник. Потом нужно получить N случайных точек внутри круга. Для этого придётся кидать точки в квадрат и исключать те, которые в круг не попадают (как в задаче А).

Пусть F - случайная точка внутри круга с центром А. Проведём дополнительные построения, как показано на рисунке ниже:

AG = AF * cos(FAG), но нам нужно, наоборот, по известным расстояниям АF и AG вычислить угол FAG. Для этого воспользуемся функцией, обратной к функции косинус — она называется арккосинус (функция acos из модуля math). Но в данном случае надо учесть, что эта функция даёт в ответе угол от 0 до π, поскольку углы, симметричные относительно оси Ох, имеют одинаковую координату х (а, значит, и одинаковое значение функции cos). Если точка располагается в нижней половине круга, вычисленный угол надо умножить на -1, чтобы получить углы от 0 до -π.

angle_FAG = acos(AG / AF)

По известному расстоянию случайной точки от центра окружности и углу с осью Ох вычислите координаты точек пересечения хорды с окружностью (как это сделать, написано выше в задаче H).

Хорды, которые длиннее стороны треугольника, рисуйте зелёным цветом, а остальные — красным.

Вычислите отношение числа хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд.

IA: Доля случайных хорд длиннее стороны вписанного треугольника — 3

Нам нужно будет провести много экспериментов для N случайных хорд. Для этого скопируйте предыдущую программу (задача I) в новый файл и переделайте её в функцию experiment, которая получает на вход число хорд, ставит случайные точки внутри квадрата, отбрасывая те, что не попали в круг, находит концы хорд, центрами которых являются эти точки, и определяет длину каждой хорды.

Функция даёт в ответе одно число — отношение числа случайных хорд, которые длиннее стороны вписанного равностороннего треугольника, к общему числу хорд (и ничего не рисует).

Вызов функции для тестирования:
from random import seed as set_seed, random
from math import sin, cos, pi, acos
            
set_seed(0)
            
            
def experiment(N):
    # тело функции
            
                
N = int(input())
M = int(input())
for i in range(M):
    print(experiment(N))
                    

IB: Вычисляем вероятность — 3

Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи IA. Программа усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.

Дополнительный список использовать не нужно.

Как случайно сломать палочку?

Палочку случайным образом ломают на три части. С какой вероятностью из полученных частей можно сложить треугольник?

В задачах J - M предлагаются разные способы случайно разломать палочку. Используйте функции для повторяющихся в этих задачах действий.

Не забудьте, что для подсчёта вероятности понадобится не только разломать N палочек и посчитать отношение благоприятных случаев к числу всех разломанных палочек, но и провести М таких экспериментов, чтобы потом усреднить результат.

J: Ломаем палочку — 1

Выберите две случайные точки разломов на исходной палочке, проверьте, можно ли из получившихся частей сложить треугольник.

Разломайте N палочек, проведите М таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.

K: Ломаем палочку — 2

Разделите палочку случайным образом на две части, выберите большую часть и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.

Разломайте N палочек, проведите М таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.

L: Ломаем палочку — 3

Разделите палочку случайным образом на две части, выберите случайным образом (с вероятностью 1/2) одну из частей и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.

Разломайте N палочек, проведите М таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.

M: Ломаем палочку — 4

Разделите палочку случайным образом на две части, выберите случайным образом одну из них (с вероятностью, пропорциональной её длине) и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.

Разломайте N палочек, проведите М таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.

Нещадно крушим палочку

На палочке случайно отмечаются 2 точки. Затем палочку ломают на Р частей. С какой вероятностью отмеченные точки окажутся на одной из полученных частей?

В задачах N и O предлагаются разные способы разломать палочку. Используйте функции для повторяющихся в этих задачах действий.

Не забудьте, что для подсчёта вероятности понадобится не только разломать N палочек и посчитать отношение благоприятных случаев к числу всех разломанных палочек, но и провести М таких экспериментов, чтобы потом усреднить результат.

N: Ломаем палочку — 5

Напишите программу, которая делит палочку на Р равных частей и проверяет, окажутся ли две случайные точки в одной части. Программа должна провести N испытаний и вычислить отношение числа благоприятных случаев к N. Проведите М таких экспериментов и посчитайте вероятность того, что точки окажутся в одной части.

O: Ломаем палочку — 6

Напишите программу, которая делит палочку на Р случайных частей и проверяет, окажутся ли две случайные точки в одной части. Программа должна провести N испытаний и вычислить отношение числа благоприятных случаев к N. Проведите М таких экспериментов и посчитайте вероятность того, что точки окажутся в одной части.