В следующих задачах понадобится функция random из модуля random.
Функция random() не имеет параметров,
при каждом следующем вызове даёт в ответе новое действительное число в интервале от 0 до 1. Если вызывать эту функцию очень много раз, то выпавшие числа равномерно заполнят этот интервал.
Для использования функции random необходимо подключить её из
библиотеки в начале программы, что делается командой
from random import random
Из полезных функций помимо random() в библиотеке лежат, например:
randint(l, r), choice(a) и shuffle(a).
При этом по умолчанию при разных запусках программы результаты random() получаются различные.
Чтобы убрать данную хаотичность, можно задать seed --- начальный параметр, по которому дальше
уже детерминировано будут генерироваться псевдослучайные значения.
from random import seed
seed(179)
Вычисляем число π
В квадрат вписали окружность и кинули N случайных точек. Какая часть точек окажется внутри окружности?
Можно предположить, что при большом числе точек число попаданий в круг будет пропорционально отношению площадей круга и квадрата. Чтобы разобраться, так ли это, проведём много экспериментов и сравним получившиеся результаты.
A: Доля точек, попавших в круг
Нам нужно будет провести M экспериментов для N случайных точек.
Для этого напишите функцию experiment, которая получает на вход число точек,
генерирует $N$ случайных точек из $[-1, 1]^2$ и проверяет, попадут ли точки с этими координатами в единичный круг.
Функция должна давать в ответе отношение числа точек, попавших в круг, к общему числу сгенерированных точек.
Во всех задачах этого листочка, где предлагается код для тестирования, в систему нужно сдавать только саму функцию experiment.
Из-за недетерминированности рандома в зависимости от способа экспериментирования ответ может немного отличаться.
Если ваши ответы в проверяющей системе все близки к правильным, но не совпадают, можете спросить у меня, какой метод генерации подразумевается.
10
1
0.8
Вызов функции для тестирования:
from random import random, seed as set_seed
set_seed(0)
def experiment(N):
# тело функции
N = int(input())
M = int(input())
for i in range(M):
print(experiment(N))
B: Как распределяются результаты многих экспериментов? - 1
Если провести много экспериментов, их результаты будут различаться. Нас интересует, как распределяются эти результаты на отрезке от 0 до 1. Разделим отрезок [0, 1] на K частей, проведём М экспериментов и посчитаем, результаты скольких экспериментов попали в каждую часть.
Для этого нужно создать дополнительный список count, каждый элемент которого — счётчик, соответствующий одному из K интервалов. После того, как проведён очередной экспериммент, программа должна определять, в какой из K интервалов попадает результат эксперимента
и увеличивать на 1 соответствующий интервалу счётчик.
Программа получает на вход три числа: N (число точек), K (число интервалов), М (число экспериментов, М >> K) и печатает через пробел, сколько результатов попало в каждый из K интервалов (то есть значения элементов списка count).
10
4
10
0 0 2 8
P.S. Гарантируется, что в тестах ни одно из значений функции experiment не попадает на границы интервалов.
C: Вычисляем число π
Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если точек будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.
Программа получает на вход два числа: N — число точек и М — число экспериментов, усредняет полученные значения и вычисляет приблизительное значение числа $\pi$.
Дополнительный список использовать не нужно.
Вычисляем вероятность
На окружности поставили три случайные точки и построили треугольник с вершинами в этих точках. Какова вероятность того, что центр окружности лежит внутри треугольника?
Предположим, что вероятность можно получить, разделив число благоприятных случаев на их общее число.
Но результаты разных экспериментов могут отличаться друг от друга. Проведём много экспериментов и посмотрим, как распределяются их значения.
D: Проверка треугольника
Дан (возможно, вырожденный) треугольник с вершинами в 3 точках на окружности $x^2+y^2 = 1$.
Напишите программу, проверяющую, лежит ли центр окружности $(0, 0)$ строго внутри этого треугольника.
Гарантируется, что тесты сгенерированы случайно равномерно на $(S^1)^{\times3}$.
Координаты точек нецелочисленные, даны во входе с точностью 9 знаков после запятой. Выводите в качестве ответа Yes или No.
E: Доля хороших треугольников
Чтобы точки на окружности располагались случайно, выбирайте случайный угол (от $0$ до $360$ градусов или
от $0$ до $2\pi$ радиан). Для вычисления декартовых координат точек на окружности используйте
функции sin и cos из библиотеки math.
Нам нужно будет провести M экспериментов для N случайных треугольников.
Для этого напишите функцию experiment, которая получает на вход число треугольников,
вычисляет случайные точки на окружности и определяет по ним тип каждого треугольника.
Функция даёт в ответе одно число — отношение числа содержащих центр треугольников к их общему количеству.
10
2
0.0
0.4
Вызов функции для тестирования:
from random import seed as set_seed, random, uniform
from math import sin, cos, pi, sqrt, hypot
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).
20
7
10
2 6 1 1 0 0 0
P.S. Гарантируется, что в тестах ни одно из значений функции experiment не попадает на границы интервалов.
G: Вычисляем вероятность
Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если треугольников будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.
Программа получает на вход два числа: N — число треугольников и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи EA. Программа
усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что центр окружности принадлежит случайному вписанному треугольнику.
13
22
0.19930069930069927
К чему стремится данное значение? Напишите краткий комментарий с док-вом, почему вероятность именно такая.
Парадокс Бертрана
Рассмотрим правильный треугольник, вписанный в окружность. Наудачу выбирается хорда окружности. Какова вероятность того, что выбранная хорда длиннее стороны треугольника?
Как наудачу выбрать хорду? Возможны следующие варианты:
1) Выбираем две случайные точки на окружности.
2) Выбираем случайный радиус, берём на нём случайную точку и проводим хорду, перпендикулярную радиусу.
3) Ставим случайную точку внутри круга и строим хорду с центром в выбранной точке.
И вы уже догадались, что результата одного эксперимента (даже при большом числе хорд) будет не достаточно.
HA: Хорды со случайными концами
Напишите программу, которая выбирает на окружности N пар случайных точек и
рассматривает N случайных хорд с концами в этих точках.
Вычислите отношение числа хорд, которые длиннее стороны вписанного в окружность
равностороннего треугольника, к общему числу хорд.
10
1
0.4
Вызов функции для тестирования:
from random import seed as set_seed, random, uniform
from math import sin, cos, pi, sqrt, hypot
set_seed(0)
def experiment(N):
# тело функции
N = int(input())
M = int(input())
for i in range(M):
print(experiment(N))
HB: Вычисляем вероятность — 1
Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если хорд будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.
Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи HA. Программа
усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.
14
8
0.40178571428571425
К чему стремится данное значение? Напишите краткий комментарий с док-вом, почему вероятность именно такая.
IA: Хорды, перпендикулярные случайному радиусу
Напишите программу, которая N раз выбирает случайный радиус (угол от $0$ до $360$ градусов
или от $0$ до $2\pi$ радиан), берёт на нём случайную точку внутри окружности и проводит через неё хорду,
перпендикулярную данному радиусу.
Вычислите отношение числа хорд, которые длиннее стороны вписанного в окружность равностороннего треугольника,
к общему числу хорд. Из-за особенностей тестирования каждую итерацию генерируйте всегда сначала угол, и затем радиус.
10
1
0.4
Вызов функции для тестирования:
from random import *
from math import *
seed(0)
def experiment(N):
# тело функции
N = int(input())
M = int(input())
for i in range(M):
print(experiment(N))
IB: Вычисляем вероятность — 2
Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если хорд будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.
Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи IA. Программа
усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.
18
14
0.44444444444444453
К чему стремится данное значение? Напишите краткий комментарий с док-вом, почему вероятность именно такая.
JA: Хорды c центром в случайной точке
Напишите программу, которая N раз выбирает случайную точку равновероятно внутри единичного круга
(как это правильно сделать?) После этого будем рассматривать (единственную) хорду, имеющую центр в этой точке.
Вычислите отношение числа хорд, которые длиннее стороны вписанного в окружность равностороннего треугольника,
к общему числу хорд.
10
2
0.2
0.2
Вызов функции для тестирования:
from random import *
from math import *
seed(0)
def experiment(N):
# тело функции
N = int(input())
M = int(input())
for i in range(M):
print(experiment(N))
JB: Вычисляем вероятность — 3
Из экспериментов, проведённых при решении предыдущих задач, мы видим, что результат отдельного эксперимента может сильно отличаться от большинства, даже если хорд будет много. Поэтому для получения более точного результата необходимо провести много экспериментов.
Программа получает на вход два числа: N — число хорд и М — число экспериментов. Эксперименты проводятся с помощью функции experiment из задачи JA. Программа
усредняет полученные в экспериментах значения и приблизительно вычисляет вероятность того, что случайная хорда длиннее стороны вписанного равностороннего треугольника.
8
18
0.2986111111111111
К чему стремится данное значение? Напишите краткий комментарий с док-вом, почему вероятность именно такая.
Как случайно сломать палочку?
Палочку случайным образом ломают на три части. С какой вероятностью из полученных частей можно сложить треугольник?
В задачах K $-$ N предлагаются разные способы случайно разломать палочку. Используйте функции для повторяющихся в этих задачах действий.
Не забудьте, что для подсчёта вероятности понадобится не только разломать N палочек и
посчитать отношение благоприятных случаев к числу всех разломанных палочек,
но и провести М таких экспериментов, чтобы потом усреднить результат.
K: Ломаем палочку — 1
Выберите две случайные точки разломов на исходной палочке, проверьте, можно ли из получившихся частей сложить треугольник.
Разломайте $N$ палочек, проведите $M$ таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.
2
2
0.5
L: Ломаем палочку — 2
Разделите палочку случайным образом на две части, выберите большую часть и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.
Разломайте $N$ палочек, проведите $M$ таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.
2
2
0.5
M: Ломаем палочку — 3
Разделите палочку случайным образом на две части, выберите случайным образом (с вероятностью 1/2) одну из частей и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.
Разломайте $N$ палочек, проведите $M$ таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.
2
2
0.0
N: Ломаем палочку — 4
Разделите палочку случайным образом на две части, выберите случайным образом одну из них (с вероятностью, пропорциональной её длине) и разделите её ещё на две части, проверьте, можно ли из получившихся частей сложить треугольник.
Разломайте $N$ палочек, проведите $M$ таких экспериментов и посчитайте вероятность того, что треугольник сложить можно.
2
2
0.75
Эквивалентен ли этот способ с каким-то из описанных выше? Кратко обоснуйте в комментариях, с каким/почему нет.