Python 确保两个随机生成的数字之和等于另外两个随机生成的数字之和 我正在编写一个程序,计算一个均匀的杆上的转弯力矩,质心在中间。我需要将杆的长度分成四个值,它们本身不必相等;但是,前两个值的和必须等于后两个值的和。杆的总长度必须随机生成-那么我该如何做呢

Python 确保两个随机生成的数字之和等于另外两个随机生成的数字之和 我正在编写一个程序,计算一个均匀的杆上的转弯力矩,质心在中间。我需要将杆的长度分成四个值,它们本身不必相等;但是,前两个值的和必须等于后两个值的和。杆的总长度必须随机生成-那么我该如何做呢,python,algorithm,random,Python,Algorithm,Random,以下是我随机生成数字的方式: random_value_one = random.uniform(1, 5) random_value_two = random.uniform(1, 5) random_value_three = random.uniform(1, 5) random_value_four = random.uniform(1, 5) total_length_of_rod = random_value_one + random_value_two + random_value

以下是我随机生成数字的方式:

random_value_one = random.uniform(1, 5)
random_value_two = random.uniform(1, 5)
random_value_three = random.uniform(1, 5)
random_value_four = random.uniform(1, 5)
total_length_of_rod = random_value_one + random_value_two + random_value_three + random_value_four
centre_of_mass = total_length_of_rod / 2

将整个过程放在一个可以调用的函数中,然后在最后有一个if循环。检查rod1+rod2==rod3+rod4,如果不是,则调用函数重新启动它。此外,或者如果python不允许这样的逻辑工作,您可能需要声明新的变量,即rod1+rod2和rod3+rod4,然后比较它们的值。

将所有内容放在一个可以调用的函数中,最后有一个if循环。检查rod1+rod2==rod3+rod4,如果不是,则调用函数重新启动它。此外,或者如果python不允许这样的逻辑工作,您可能需要声明新的变量,即rod1+rod2和rod3+rod4,然后比较它们的值。

一种方法是获得所有具有正确总和的数字对,然后随机选择一个

import random
r1 = random.randrange(1, 6)
r2 = random.randrange(1, 6)
pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
r3, r4 = random.choice(pairs)
total_length_of_rod = r1 + r2 + r3 + r4
centre_of_mass = total_length_of_rod / 2
import random

# option1: random 1st and 2nd, 3rd splits total, fourth is difference
rv1 = random.uniform(1, 5)
rv2 = random.uniform(1, 5)
sumOfFirst2 = rv1 + rv2
rv3 = random.uniform(1, sumOfFirst2-1)
rv4 = sumOfFirst2 - rv3

print("Option1:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 2: random total length, split each half randomly
totalLength = random.uniform(4,20)
sumOfFirst2 = totalLength/2
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option2:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 3: random half length, split each side
sumOfFirst2 = random.uniform(2,10)
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option3:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 4: random extermities, random sum of center parts then split center
rv1         = random.uniform(1,5)
rv4         = random.uniform(1,5)
center      = random.uniform(2,10)
totalLength = center+rv1+rv4
rv2         = totalLength/2 - rv1 
rv3         = totalLength/2 - rv4

print("Option4:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

一种方法是获得所有具有正确和的数字对,然后随机选择一个

import random
r1 = random.randrange(1, 6)
r2 = random.randrange(1, 6)
pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
r3, r4 = random.choice(pairs)
total_length_of_rod = r1 + r2 + r3 + r4
centre_of_mass = total_length_of_rod / 2
import random

# option1: random 1st and 2nd, 3rd splits total, fourth is difference
rv1 = random.uniform(1, 5)
rv2 = random.uniform(1, 5)
sumOfFirst2 = rv1 + rv2
rv3 = random.uniform(1, sumOfFirst2-1)
rv4 = sumOfFirst2 - rv3

print("Option1:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 2: random total length, split each half randomly
totalLength = random.uniform(4,20)
sumOfFirst2 = totalLength/2
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option2:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 3: random half length, split each side
sumOfFirst2 = random.uniform(2,10)
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option3:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 4: random extermities, random sum of center parts then split center
rv1         = random.uniform(1,5)
rv4         = random.uniform(1,5)
center      = random.uniform(2,10)
totalLength = center+rv1+rv4
rv2         = totalLength/2 - rv1 
rv3         = totalLength/2 - rv4

print("Option4:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

这个逻辑呢?生成前两个随机数并相加。然后生成第三个随机数,并测试它是否小于前两个的加法。如果是,最后一个随机数将是[前两个的加法-第三个随机数]。如果不是,则再次生成第三个随机数。这确保了可以添加到相同的长度,如果第三个数字较大,则不可能添加到相同的长度。第四个数字不是随机生成的,但它是随机的,因为第三个数字是随机的,它必须等于前两个数字的和,所以最后一个数字实际上没有选择的余地


这样可以避免嵌套循环并提高效率:

这种逻辑怎么样?生成前两个随机数并相加。然后生成第三个随机数,并测试它是否小于前两个的加法。如果是,最后一个随机数将是[前两个的加法-第三个随机数]。如果不是,则再次生成第三个随机数。这确保了可以添加到相同的长度,如果第三个数字较大,则不可能添加到相同的长度。第四个数字不是随机生成的,但它是随机的,因为第三个数字是随机的,它必须等于前两个数字的和,所以最后一个数字实际上没有选择的余地


这样可以避免嵌套循环并提高效率:

简而言之,第四个值实际上不是随机的。因此,您可以生成前两个并计算总和。然后生成该总和范围内的第三个值。第四个值是差值。也可以从随机拆分的总长度或半长度开始工作

import random
r1 = random.randrange(1, 6)
r2 = random.randrange(1, 6)
pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
r3, r4 = random.choice(pairs)
total_length_of_rod = r1 + r2 + r3 + r4
centre_of_mass = total_length_of_rod / 2
import random

# option1: random 1st and 2nd, 3rd splits total, fourth is difference
rv1 = random.uniform(1, 5)
rv2 = random.uniform(1, 5)
sumOfFirst2 = rv1 + rv2
rv3 = random.uniform(1, sumOfFirst2-1)
rv4 = sumOfFirst2 - rv3

print("Option1:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 2: random total length, split each half randomly
totalLength = random.uniform(4,20)
sumOfFirst2 = totalLength/2
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option2:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 3: random half length, split each side
sumOfFirst2 = random.uniform(2,10)
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option3:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 4: random extermities, random sum of center parts then split center
rv1         = random.uniform(1,5)
rv4         = random.uniform(1,5)
center      = random.uniform(2,10)
totalLength = center+rv1+rv4
rv2         = totalLength/2 - rv1 
rv3         = totalLength/2 - rv4

print("Option4:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)
输出:

Option1:
3.8733926704150394 1.2002268887772458 5.073619559192285
3.840231922558826 1.2333876366334593 5.073619559192285

Option2:
3.547962226731686 1.2866434919683414 4.834605718700027
1.52708327731985 3.3075224413801774 4.834605718700027

Option3:
5.271438412416368 3.9102475112312245 9.181685923647592
2.116625606537367 7.065060317110225 9.181685923647592

Option4:
2.0745608124206196 4.236051851683254 6.310612664103874
4.163042898863589 2.1475697652402848 6.310612664103873 

如果您关心分布,您可以选择最适合您需求的方法。

简而言之,您的第四个值实际上不是随机的。因此,您可以生成前两个并计算总和。然后生成该总和范围内的第三个值。第四个值是差值。也可以从随机拆分的总长度或半长度开始工作

import random
r1 = random.randrange(1, 6)
r2 = random.randrange(1, 6)
pairs = [x for x in [(i, j) for i in range(1, 6) for j in range(1, 6)] if sum(x) == r1 + r2]
r3, r4 = random.choice(pairs)
total_length_of_rod = r1 + r2 + r3 + r4
centre_of_mass = total_length_of_rod / 2
import random

# option1: random 1st and 2nd, 3rd splits total, fourth is difference
rv1 = random.uniform(1, 5)
rv2 = random.uniform(1, 5)
sumOfFirst2 = rv1 + rv2
rv3 = random.uniform(1, sumOfFirst2-1)
rv4 = sumOfFirst2 - rv3

print("Option1:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 2: random total length, split each half randomly
totalLength = random.uniform(4,20)
sumOfFirst2 = totalLength/2
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option2:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 3: random half length, split each side
sumOfFirst2 = random.uniform(2,10)
rv1         = random.uniform(1,sumOfFirst2-1)
rv2         = sumOfFirst2 - rv1
rv3         = random.uniform(1,sumOfFirst2-1)
rv4         = sumOfFirst2 - rv3

print("Option3:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)

# option 4: random extermities, random sum of center parts then split center
rv1         = random.uniform(1,5)
rv4         = random.uniform(1,5)
center      = random.uniform(2,10)
totalLength = center+rv1+rv4
rv2         = totalLength/2 - rv1 
rv3         = totalLength/2 - rv4

print("Option4:")
print(rv1,rv2,rv1+rv2)
print(rv3,rv4,rv3+rv4)
输出:

Option1:
3.8733926704150394 1.2002268887772458 5.073619559192285
3.840231922558826 1.2333876366334593 5.073619559192285

Option2:
3.547962226731686 1.2866434919683414 4.834605718700027
1.52708327731985 3.3075224413801774 4.834605718700027

Option3:
5.271438412416368 3.9102475112312245 9.181685923647592
2.116625606537367 7.065060317110225 9.181685923647592

Option4:
2.0745608124206196 4.236051851683254 6.310612664103874
4.163042898863589 2.1475697652402848 6.310612664103873 

如果您关心发行版,您可以选择最适合您需求的方法。

这应该可以满足您的需要:

random_sum = random.uniform(1, 5)
random_value_one = random.uniform(1, random_sum)
random_value_two = random_sum - random_value_one

random_value_three = random.uniform(1, random_sum)
random_value_four = random_sum - random_value_three 

这将帮助您找到需要的地方:

random_sum = random.uniform(1, 5)
random_value_one = random.uniform(1, random_sum)
random_value_two = random_sum - random_value_one

random_value_three = random.uniform(1, random_sum)
random_value_four = random_sum - random_value_three 

它已经在一个可调用函数中了-我只是没有在问题中放那一点代码,因为它很长,我不想阻塞问题的细节。它已经在一个可调用函数中了-我只是没有在问题中放那一点代码,因为它很长,我不想阻塞问题的细节。太好了-祝你好运我早就想到了!谢谢大家!@SendViaAirmail不确定它有多优秀,但边际分布是完全不同的。这真的是你想要的吗?总长度分布看起来也有点不太好-希望我能想到这一点!谢谢大家!@SendViaAirmail不确定它有多优秀,但边际分布是完全不同的。这真的是你想要的吗?总长度分布看起来也有点偏离。您是否认识到,如果值在[1…5]范围内,sum将在[2…10]范围内?您是否认识到,如果值在[1…5]范围内,sum将在[2…10]范围内?