我有一个函数,可以生成一组满足指定约束的混合物。我的代码:
def generate_mix():
while True:
n2 = np.random.uniform(0.0,1.15)
c2 = np.random.uniform(0.1,10.3)
c3 = np.random.uniform(0.02,2.66)
ic4 = np.random.uniform(0,0.71)
nc4 = np.random.uniform(0,0.71)
ic5 = np.random.uniform(0,0.04)
nc5 = np.random.uniform(0,0.01)
if (n2/c2 <= 0.3 and
0.20 >= c3/c2 <= 0.26 and
0.20 >= ic4/c3 <= 0.27 and
nc4/ic4 <= 1 and
ic5/nc4 <= 0.06 and
nc5/ic5 <= 0.25):
comp_list = [c2, c3, ic4, nc4, ic5, nc5, n2]
comp_list.insert(0, 100 - sum(comp_list))
return comp_list
break
big_list = [generate_mix() for _ in range(1000)]
该代码在我的计算机上运行大约需要 18 秒。我想知道这种 while 循环是否有更有效的方法? ..这是一种强制均匀分布的方式,这也许是为什么它需要这么长时间的原因。
如果没有的话我想我会忍受它。
重点是生成在 numpy 随机分布指定范围内的混合。这是我的申请所必须的。
因此,您想要做的是首先生成自变量,然后生成因变量,而不是生成所有变量,然后在不满足约束时再次生成。
所以我会这样做
def generate_mix():
c2 = np.random.uniform(0.1, 10.3)
那么由于 n2/c2 必须 <= 0.3
n2 = np.random.uniform(0.0, max(1.15, .3/c2))
等等。
我是一名优秀的程序员,十分优秀!