循环生成满足动态条件的数据:如何存储增量和小于5*L的R个列表
解决方案
核心思路
你当前代码的问题是固定执行R次循环,若某次循环生成的列表不满足条件就会跳过,最终结果数量会小于R。最优实现可以根据你的需求分两种场景:
方案1:保留原固定生成长度的逻辑(每次生成proc_length个点,仅筛选符合条件的)
把固定次数的for循环改为while循环,直到收集到R个符合要求的列表即可,同时可以简化判断逻辑降低算力开销:
import numpy as np R = 10 lam = 1 proc_length = 100 L = 1 threshold = 5 * L exponential_procs_lists = [] # 循环直到收集到R个符合条件的列表 while len(exponential_procs_lists) < R: z_exponential = np.random.exponential(lam, proc_length) z_exponential.sort() # 原逻辑中sum(np.diff(insert(0)))等价于排序后序列的最大值,可直接判断 if z_exponential[-1] < threshold: z_dat_r = np.insert(z_exponential, 0, 0) exponential_procs_lists.append(z_dat_r)
说明:这个方案完全保留你原来的生成逻辑,只是把循环条件改成了判断结果列表长度,适合你需要固定每个列表原始生成长度为proc_length的场景。
方案2:按需动态生成长度(最高效,无需筛选)
因为你允许各列表长度不同,完全可以直接生成增量直到接近阈值,每次生成的列表天然符合要求,不需要做拒绝采样,效率远高于筛选方案:
import numpy as np R = 10 lam = 1 L = 1 threshold = 5 * L exponential_procs_lists = [] for _ in range(R): current_sum = 0 points = [0] # 逐个生成指数增量,累加不超过阈值就加入列表 while True: step = np.random.exponential(lam) if current_sum + step >= threshold: break current_sum += step points.append(current_sum) exponential_procs_lists.append(np.array(points))
说明:这个方案不需要做任何无效的筛选操作,每一轮循环都能生成1个符合要求的列表,效率最高,也完全符合你允许列表长度不同的要求。
内容的提问来源于stack exchange,提问作者user309575
相关产品推荐
相关产品推荐

