嗨,我想生成两个随机数,使它们的平方和等于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。
最佳答案
你的要求不是两个不同的数字。它是针对一对平方和等于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)