根据约束步骤过程生成数字列表

时间:2016-01-18 15:46:06

标签: python numpy pandas random

我正在尝试使用以下代码生成一个包含8个数字的列表:

Root element is missing

然而,当我运行代码时,输​​出的数字量不一致,范围从3到5.例如,1次运行会给我:

import numpy as np
import pandas as pd

n2 = np.random.uniform(0.1, 1.5)
c2 = np.random.uniform(4,14)
c3 = np.random.uniform(0.1,2.9)
ic4 = np.random.uniform(0.01,1)
nc4 = np.random.uniform(0.01,1)
ic5 = np.random.uniform(0,0.2)
nc5 = np.random.uniform(0,0.01)

comp_list = []

for i in range(1):
    if n2/c2 <= 0.11:
        comp_list.append(c2)
        comp_list.append(n2)
    if c3/c2 <= 0.26:
        comp_list.append(c3)
    if ic4/c3 <= 0.27:
        comp_list.append(ic4)
    if nc4/ic4 <= 1:
        comp_list.append(nc4)
    if ic5/nc4 <= 0.06:
        comp_list.append(ic5)
    if nc5/ic5 <= 0.25:
        comp_list.append(nc5)

    sum = n2+c2+c3+ic4+nc4+ic5+nc5
    c1 = 100-sum
    comp_list.append(c1)

df = pd.Series(comp_list)

print df

第二次运行会给我:

0     1.560
1     0.251
2     0.008
3     86.665

我不知道为什么输出不一致。

也许我需要迭代一个随机分布,直到满足所有if语句?还是我错过了一些明显的东西?

1 个答案:

答案 0 :(得分:1)

您希望将所有内容包含在while循环中。滚动所有数字。如果它们都满足您的条件,请创建必要的列表。只要其中一个条件不满足,所有数字都将被重新滚动。

您想要重新打印所有号码的原因是它们彼此独立。例如,c2n2/c2都涉及c3/c2。如果满足n2/c2并且您保留了这两个数字,那么为了满足条件c3,您可以拥有的c3/c2值会受到您为c2选择的内容的限制}。

import numpy as np

while True:
    n2 = np.random.uniform(0.1, 1.5)
    c2 = np.random.uniform(4,14)
    c3 = np.random.uniform(0.1,2.9)
    ic4 = np.random.uniform(0.01,1)
    nc4 = np.random.uniform(0.01,1)
    ic5 = np.random.uniform(0,0.2)
    nc5 = np.random.uniform(0,0.01)

    if (n2/c2 <= 0.11 and
        c3/c2 <= 0.26 and
        ic4/c3 <= 0.27 and
        nc4/ic4 <= 1 and
        ic5/nc4 <= 0.06 and
        nc5/ic5 <= 0.25):

        comp_list = [n2, c2, c3, ic4, nc4, ic5, nc5]
        comp_list.append(100 - sum(comp_list))
        break

修改:为了生成此类列表的列表,请根据需要多次迭代此代码,并每次附加comp_list的结果。

big_list = []
for _ in range(10):
   # while stuff
   big_list.append(comp_list)

如果您希望在代码中的不同位置运行此功能,则可以将其放入函数中。

def generate_numbers():
    while True:
        ...
    return comp_list

然后你可以做big_list = [generate_numbers() for _ in range(10)]