#random #julia #counting
Вопрос:
Я хочу случайным образом «разбросать» палочки длиной 1, как показано на диаграмме.
Я также хочу сосчитать палочки, которые коснулись красных линий.
Мой подход состоял в создании нормализованных векторов, которые случайным образом ориентированы в пространстве.
Проблема в том, что все они находятся в начале координат, и я также не уверен, как идентифицировать и подсчитать тех, кто касается красных линий
a = [randn(), randn()];
line = a/norm(a) # Normalized vector in random direction
Комментарии:
1. Интересный вопрос, не могли бы вы поделиться полным кодом, чтобы другие могли попытаться помочь?
2. Похоже на эксперимент с иглой графа Буффона , если только вы не добавляете ограничения на границах. Формулы для определения того, когда игла касается линии, приведены в связанной статье.
3. Да, это эксперимент Буффона, но я понимаю, что вопрос в том, как правильно его смоделировать.
Ответ №1:
Вот один из способов подойти к вашему вопросу с помощью моделирования:
julia> using Statistics
julia> function gen_point()
α = rand() * 2π
range_x = 5 # anything as your lines are horizontal
range_y::Int = 5 # must be a positive integer
@assert range_y >= 1
x0 = [rand() * range_x, rand() * range_y]
xd = [cos(α), sin(α)]
return (x0, x0 . xd)
end
gen_point (generic function with 1 method)
julia> intersects(point) = floor(point[1][2]) != floor(point[2][2])
intersects (generic function with 1 method)
julia> mean((intersects(gen_point()) for _ in 1:100_000))
0.63731
julia> 2/π # our simulation recovers the theoretical result
0.6366197723675814
Некоторые комментарии:
- В своем решении я выбираю угол в диапазоне (0,2 пи) ;
- Я использую
x_range
иy_range
для определения прямоугольника, в котором разбросаны линии (x_range
может быть что угодно, но важно, чтобы этоy_range
было целое число); - Я не оптимизировал код для скорости, но для простоты; в моей
gen_point
функции я создаю 2-элемент вектора проведение 2-х элементных векторов, указывающих (Х,Y) местоположения конечных точек линий;intersects
функция — как вы можете видеть, это довольно просто: если ось Y из обеих конечных точек не совпадают целая часть это означает, что линия должна пересекать горизонтальную линию формеy=i
, гдеi
— целое число (я игнорирую тот случай, когда мы хотели опорных точек, которые точно целочисленноеy
значение оси, как это ничтожно мало); - обратите внимание, что ваш график неверен, так как оси x и y масштабируются по — разному, поэтому на самом деле нарисованные вами линии не все имеют длину 1 (это боковой комментарий-не влияет на решение).
Комментарии:
1. а — точно. Я не заметил, что об этом
randn
неrand
идет речь. Исправлено