首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成两个平方和==1的随机数

生成两个平方和==1的随机数
EN

Stack Overflow用户
提问于 2019-05-08 18:51:01
回答 5查看 820关注 0票数 4

嗨,我想生成两个随机数,使得它们的平方之和等于1。

我写了这段代码。它们的平方之和可能不完全等于1,但应该接近0.999。我也使用了if(math.isclose(abs(gene_value_1)**2 + abs(gene_value_2)**2, 1)),但它不起作用。

代码语言:javascript
复制
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。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-05-08 18:57:23

您的要求实际上不是两个不同的数字。它适用于平方和等于1的一对数字。

如果是x**2 + y**2 = 1,那么y完全由xy = sqrt(1 - x**2)决定。

代码语言:javascript
复制
gene_value_1 = random.uniform(0, 1)
gene_value_2 = math.sqrt(1.0 - gene_value_1**2)

正如对问题和答案的评论中所提到的,以这种方式得到的分布对于这两个数字是不一致的。由于gene_value_1gene_value_2在均匀情况下将描述笛卡尔空间中的单位圆,所以您可以这样做。

代码语言:javascript
复制
angle = random.uniform(0, 2 * math.pi)
gene_value_1 = math.cos(angle)
gene_value_2 = math.sin(angle)
票数 10
EN

Stack Overflow用户

发布于 2019-05-08 19:52:18

我完全赞扬Mark Dickinson's suggestion使用三角函数生成两个平方和为1的随机数。这是最重要的三角恒等式之一,有时被称为正弦曲线和余弦的毕达哥拉斯公式。

正弦^2(θ)+cos^2(θ)=1

因此,我们在区间theta中随机采样[-pi, pi],并取其sinecosine。这给了我们两个数字,当它独立地平方,然后求和,等于1。

因此,实现应该类似于:

代码语言:javascript
复制
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)))
代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-05-08 19:04:12

产生两个随机数,其平方之和几乎等于1。

假设几乎相等意味着一些小的三角洲

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56047264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档