Python 如何使用随机模块生成满足条件的变量列表

Python 如何使用随机模块生成满足条件的变量列表,python,Python,我的想法如下: import random list=[] while True: A = random.uniform(0,3150) / 3150 B = random.uniform(0,2200) / 2200 C = random.uniform(0,1000) / 1000 D = random.uniform(0,2600) / 2600 E = random.uniform(0,2540) / 2540 F = random.un

我的想法如下:

import random

list=[]
while True:
    A = random.uniform(0,3150) / 3150
    B = random.uniform(0,2200) / 2200
    C = random.uniform(0,1000) / 1000
    D = random.uniform(0,2600) / 2600
    E = random.uniform(0,2540) / 2540
    F = random.uniform(0,1200) / 1200
    G = random.uniform(0,1050) / 1050

    if A+B+C+D+E+F+G == 0.965:
        list[0] = A
        list[1] = B
        list[2] = C
        list[3] = D
        list[4] = E
        list[5] = F
        list[6] = G
        print(list)
        break
但即使我操作这个代码,也要花很长时间才能得到一个列表。
这里有一种方法,使用生成器

import random

def solution(precision):
    while True:
        A = random.uniform(0,3150) / 3150
        B = random.uniform(0,2200) / 2200
        C = random.uniform(0,1000) / 1000
        D = random.uniform(0,2600) / 2600
        E = random.uniform(0,2540) / 2540
        F = random.uniform(0,1200) / 1200
        G = random.uniform(0,1050) / 1050

        if abs(A+B+C+D+E+F+G - 0.965) <= precision:
            yield [A, B, C, D, E, F, G]
随机导入
def溶液(精度):
尽管如此:
A=随机均匀(03150)/3150
B=随机均匀(02200)/2200
C=随机均匀(01000)/1000
D=随机均匀(02600)/2600
E=随机均匀(02540)/2540
F=随机均匀(01200)/1200
G=随机均匀(01050)/1050

首先,如果abs(A+B+C+D+E+F+G-0.965),我不明白为什么要使用
random.uniform(0,upperLim)/upperLim
,因为它总是一个介于0和1之间的值。但是,如果这是实现的必要部分,那么就继续吧。否则,将其更改为
random.uniform(0,1)
,因为这样可以避免不必要的乘法,并提供更高的精度

要确保随机数之和为0.965,请执行以下操作以避免多次循环和检查:

首先将上限从您指定的值更改为返回最大值0.965的值,即,
random.uniform(03150*0.965)/3150

之后,根据已经满足的条件生成数字

maxLists = 100
currLists = 0
while True:
    A = random.uniform(0, 0.965) # I'll use (0, 0.965) but you can replace it
    B = random.uniform(0, 0.965 - A)
    C = random.uniform(0, 0.965 - (A + B))
    D = random.uniform(0, 0.965 - (A + B + C))
    E = random.uniform(0, 0.965 - (A + B + C + D))
    F = random.uniform(0, 0.965 - (A + B + C + D + E))
    G = 0.965 - (A + B + C + D + E + F)

    # populate them into a list
    listOfNums = [A, B, C, D, E, F, G]

    # get numbers that are zero because we want to prevent only the first few numbers adding 
    # upto 0.965 all the time 
    zeros = [i for i, e in enumerate(listOfNums) if e == 0]
    nonZeros = [i for i, e in enumerate(listOfNums) if e != 0]
    
    # do something with numbers here, maybe randomly take some part of the value from
    # non zero indices and assign it to indices with zero value if you need the numbers
    # to have some minimum value or if you have some other constraint

    currLists += 1
    print(listOfNums)
    if currLists == maxLists: break

编辑:

下面是我运行它后得到的一些结果

[0.17790933642353207, 0.203575715409321, 0.17296325968456305, 0.12888905609400236, 0.07906382215736181, 0.19622480233464165, 0.006374007896577938]
[0.049602151767929197, 0.12732071710856213, 0.6719775449266687, 0.08616832676415115, 0.002068199017310945, 0.0015719942386102515, 0.026291066176767575]
[0.4216568638854053, 0.0841285730604016, 0.12581422942385648, 0.04125099314750179, 0.013789268384205427, 0.12463265303883869, 0.1537274190597907]
[0.39352655740635734, 0.08302194874949533, 0.05585858753600888, 0.14417023258593673, 0.17742466007873198, 0.042698164836977186, 0.06829984880649254]
[0.836553479500795, 0.019661470617368986, 0.06300565338226506, 0.021033910322500717, 0.0234921077113921, 0.0002043707861913963, 0.0010490076794867909]
[0.5334487166183782, 0.07743001493044013, 0.3431304879017562, 0.001616778025312949, 0.003948535326924425, 0.001755908717321748, 0.003669558479866386]

您可以看到最后几个结果接近于零,这就是为什么您需要从前面的值中提取一部分并将其添加到这些值中,或者您可以随机地将这些数字混洗

不清楚您的条件是什么。你期望随机制服(03150)/3150是什么?你为什么认为这样的数字加起来正好是
0.965
?还不确定这个问题是否有确切的解决方案。。。因此,您可以选择abs(A+B+C+D+E+F+G-0.965),如果成功,您填写列表的方式将失败,因为列表[0]尚未定义。试试list=[A,B,C,D,D,E,F,G]代替哦,对不起。变量是体积,即质量除以密度。条件是,所有变量之和必须是0.965,即总体积。一旦你确定了A到F,G的值就固定了,条件是所有值的和必须是0.965。您只能随机选择7个值中的6个。第7个值是隐含的。因为其他值是随机的,所以它是“某种随机的”。因此,不要选择G作为随机变量,而应该将其设置为0.965-A-B-C-D-E-F。