Счетные палочки, которые касаются красных линий в Джулии

#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 идет речь. Исправлено