我写了一个python脚本,它需要一个函数来生成一个随机的数字组合,根据要使用的最小值和最大值以及应该用于生成组合的数字的数量来平均输入的平均值。
我被这个函数检查了,因为这个函数必须在分析中每个月循环,然后在几千次模拟中循环。
我需要能够运行大量的模拟,并寻找一种方法,可以修改它以利用数组并内置numpy算术而不是for循环。
这是我目前编写的函数:
def deal_months(ccc, num_deals, min, max):
if len(ccc) != len(num_deals):
raise Exception("ccc is not the same length as num_deals")
integers = list(range(min, max + 1))
combinations = [list(combinations_with_replacement(integers, 1)),
list(combinations_with_replacement(integers, 2)),
list(combinations_with_replacement(integers, 3)),
list(combinations_with_replacement(integers, 4))]
final_combos = []
for ccc, num_deals in zip(ccc, num_deals):
if num_deals == 0:
final_combos += [0]
continue
matching_combos = [combo for combo in combinations[num_deals - 1] if sum(combo) / num_deals == ccc]
if not matching_combos:
final_combos += [0]
continue
rand = random.randint(0, len(matching_combos) - 1)
final_combos += [matching_combos[rand]]
return final_combos
这是用于预测业务模型中的收入,ccc
和num_deals
应该是一个值的列表或数组,其长度等于分析中的总月数。
在模型中,ccc
是随机正态分布,平均值为8,标准差为3,四舍五入,num_deals
在0-4之间,最小值为0,最大值为36。
1条答案
按热度按时间pwuypxnk1#
在不使用任何numpy花哨的向量化计算的情况下,你已经可以通过预计算和记忆所有内容来大大减少时间(假设你对大量样本N重复这个过程):
请注意,大部分时间是预先计算,一旦完成,即使是大量的采样也变得微不足道:
你也可以通过设置随机种子来确保相同的结果,让自己相信我的魔法等同于你的原始代码: