我正在尝试使用以下代码生成一个包含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语句?还是我错过了一些明显的东西?
答案 0 :(得分:1)
您希望将所有内容包含在while循环中。滚动所有数字。如果它们都满足您的条件,请创建必要的列表。只要其中一个条件不满足,所有数字都将被重新滚动。
您想要重新打印所有号码的原因是它们彼此独立。例如,c2
和n2/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)]
。