嗨,我想生成两个随机数,使得它们的平方之和等于1。
我写了这段代码。它们的平方之和可能不完全等于1,但应该接近0.999。我也使用了if(math.isclose(abs(gene_value_1)**2 + abs(gene_value_2)**2, 1)),但它不起作用。
gene_value_1 = random.uniform(0, 1)
gene_value_2 = random.uniform(0, 1)
if(abs(gene_value_1)**2 + abs(gene_value_2)**2) == 1:
print(added)我想要生成两个随机数,它们的平方之和几乎等于1。
发布于 2019-05-08 18:57:23
您的要求实际上不是两个不同的数字。它适用于平方和等于1的一对数字。
如果是x**2 + y**2 = 1,那么y完全由x:y = sqrt(1 - x**2)决定。
gene_value_1 = random.uniform(0, 1)
gene_value_2 = math.sqrt(1.0 - gene_value_1**2)正如对问题和答案的评论中所提到的,以这种方式得到的分布对于这两个数字是不一致的。由于gene_value_1和gene_value_2在均匀情况下将描述笛卡尔空间中的单位圆,所以您可以这样做。
angle = random.uniform(0, 2 * math.pi)
gene_value_1 = math.cos(angle)
gene_value_2 = math.sin(angle)发布于 2019-05-08 19:52:18
我完全赞扬Mark Dickinson's suggestion使用三角函数生成两个平方和为1的随机数。这是最重要的三角恒等式之一,有时被称为正弦曲线和余弦的毕达哥拉斯公式。
正弦^2(θ)+cos^2(θ)=1
因此,我们在区间theta中随机采样[-pi, pi],并取其sine和cosine。这给了我们两个数字,当它独立地平方,然后求和,等于1。
因此,实现应该类似于:
def squared_unity():
r = np.random.uniform(-np.pi, np.pi)
r1, r2 = np.cos(r), np.sin(r)
# sanity check
sq_sum = np.sum(np.square([r1, r2]))
print("the two random numbers are: {}, {}".format(round(r1, 4), round(r2, 4)))
print("sum of the squares of them is: {}".format(round(sq_sum, 4)))In [172]: for i in range(10):
...: squared_unity()
the two random numbers are: -0.4232, 0.906
sum of the squares of them is: 1.0
the two random numbers are: -0.6432, 0.7657
sum of the squares of them is: 1.0
the two random numbers are: -0.9854, 0.1701
sum of the squares of them is: 1.0
the two random numbers are: 0.6192, -0.7852
sum of the squares of them is: 1.0
the two random numbers are: 0.613, 0.7901
sum of the squares of them is: 1.0
the two random numbers are: 0.3289, -0.9444
sum of the squares of them is: 1.0
the two random numbers are: -0.6289, -0.7775
sum of the squares of them is: 1.0
the two random numbers are: 0.5851, 0.811
sum of the squares of them is: 1.0
the two random numbers are: -0.9515, 0.3076
sum of the squares of them is: 1.0
the two random numbers are: 0.992, -0.1258
sum of the squares of them is: 1.0发布于 2019-05-08 19:04:12
产生两个随机数,其平方之和几乎等于1。
假设几乎相等意味着一些小的三角洲
delta = 0.00000000001
gene_value_1 = random.uniform(0,1)
gene_value_2 = math.sqrt(1.0 - gene_value_1**2)
gene_value_2 = random.uniform(gene_value_2-delta,gene_value_2+delta)https://stackoverflow.com/questions/56047264
复制相似问题