在 Julia 中计算触及红线的棍子

Counting sticks that touch red lines in Julia

我想随机“散布”长度为 1 的木棍,如图所示。
我也想数一下碰到红线的木棍

我的方法是创建在 space 中随机定向的归一化向量。
问题是他们都在原点,我也不确定如何识别和统计触摸红线的人

a = [randn(), randn()]; 
line = a/norm(a) # Normalized vector in random direction

以下是使用模拟解决问题的方法之一:

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,2pi) 范围内对角度进行采样;
  • 我使用x_rangey_range来定义线条散布的矩形(x_range可以是任何东西,但重要的是y_range是一个整数);
  • 我优化代码不是为了速度,而是为了简单;在我的 gen_point 函数中,我生成一个二元素向量,其中包含指示直线端点 (x,y) 位置的二元素向量; intersects 函数 - 如您所见非常简单:如果两个端点的 y 轴没有相同的整数部分,这意味着该线必须与 y=i 形式的水平线相交,其中 i 是一个整数(我忽略了我们将采样具有正好整数 y 轴值的点的情况,因为这可以忽略不计);
  • 请注意,您的绘图不正确,因为 x 轴和 y 轴的缩放比例不同,因此实际上您绘制的线条的长度并不都是 1(这是旁注 - 不影响解决方案)