【问题标题】:How to calculate how many coordinates lie between 2 circles of radius 35 and 65?如何计算半径为 35 和 65 的 2 个圆之间有多少个坐标?
【发布时间】:2013-04-09 22:53:28
【问题描述】:

我知道答案应该是我的坐标的大约 60% 在这个范围内,但我只得到大约 20%

import random
import pylab
import numpy
pylab.close("all")                                              #all import statements
x = [(random.randint(0,100)) for i in range(3000)]      #creating list of x coordinates
y = [(random.randint(0,100)) for j in range(3000)]      #creating list of y coordinates
array=zip(x,y)                                                  #creating an array by combining the x and y coordinates
counter = 0
for i, j in array:
        if 35**2 <= (i**2+j**2) <= 65**2:
                counter+= 1
print counter

谁能告诉我我做错了什么?

【问题讨论】:

  • 你怎么知道你是否使用随机数?
  • 在这么大的样本上,仅通过查看该区域就应该接近 60%

标签: python arrays loops counter


【解决方案1】:

问题出在这一行:

if 35**2 <= (i**2+j**2) <= 65**2:

这是检查坐标是否在以原点为中心的半径为 35 的圆和以原点为中心的半径为 65 的圆之间。

但由于您要测试的坐标始终位于正-正象限中,因此只有 1/4 的坐标会落在您预期的圆圈内。

最简单的解决方法是将randint 调用更改为使用(-50, 50) 而不是(0, 100)

【讨论】:

  • 他正在检查半径为 35 和半径为 65 的圆。
  • 对于半径为 65 的圆,所有点都将满足 x^2+y^2 = 65^2,因此该等式检查具有这些 半径的圆,而不是直径.
  • 糟糕,你是对的,所以这只是第二个问题。我会编辑它。
【解决方案2】:

你的区域是 10000,在第一象限。您正在查看面积为

的样本
pi(65**2 - 35**2)/4  

这是 2356 ... 或总面积的 23.56%。所以,你得到了正确的答案。

顺便说一句,您的代码不需要那些 pylab 和 numpy 导入。

【讨论】:

  • 我想你的意思是65**2 - 35**2,而不是*
  • 你是对的 - 我应该第一次将方程式显示为代码,以便正确显示重复的 *。
【解决方案3】:

您可以通过pylab.imshow() 将其可视化:

import numpy as np
import pylab as pl
y, x = np.mgrid[:100, :100]
d = x**2 + y**2
mask = (35**2 <= d) & (d <= 65**2)
pl.imshow(mask, origin="lower")

输出:

【讨论】:

  • 漂亮的视觉演示。
【解决方案4】:

不,你应该得到不到 30%。你只是填满了第一象限!

这是一个情节:

【讨论】:

  • 该图没有显示(四分之一)圆圈,因此很难从中获取很多信息……
  • 是的。但关键是其他三个象限什么都没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多