简而言之,您的第四个值实际上并不是随机的。因此,您可以生成前两个并计算总和。然后在该总和范围内生成第三个。第四个值是差异。您还可以从随机拆分的总长度或一半长度开始工作。
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
如果您担心分布,您可以选择最适合您要求的方法。