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