我想创建一个包含10,000个元素的列表,每个元素都将一个值传输到另一个随机选择的元素,并重复100,000次(或更多)。可以分配转移值的分布(例如,正态或对数正态等)。
我能想到的是使用循环并分配另一个列表来保存传输值。
考虑运行时间可能很长,有没有办法有效地完成此操作?
例如: 1.初始状态:
x = [5, 5, 5, 5, 5]
2。所有元素随机减少一个数字:
x = [4, 3, 4, 1, 2]
3。我将创建另一个列表x2,以保存更改,该值将在x中随机分配给元素(但不是该值来自的确切元素,例如x2 [0]永远不会分配给x [0]) :
x2 = [1, 2, 1, 4, 3]
4。最终我可能会得到:
x = [7, 7, 7, 2, 2]
x2[1]
和x2[2]
已添加到x[0]
,x2[3]
至x[1]
,x2[4]
至x[2]
,{{1} }到x2[0]
,x[3]
却什么也没有发生(这是一个示例,因为所有事物都是随机的)。
我的当前代码如下所示,具有固定值,在选择过程中不能排除x [i]。
x[4]
答案 0 :(得分:0)
希望我已经正确理解了算法。该解释在代码的注释中:
import random
# initial state
x = [5, 5, 5, 5, 5]
print('step 1:\tx =\t', x)
# decrease each element by random number = create list x2
x2 = [random.randint(1, 3) for _ in range(len(x))]
print('step 2:\tx2 =\t', x2)
x = [vx - vx2 for vx, vx2 in zip(x, x2)]
print('step 3:\tx =\t', x)
while x2:
# pop element from x2
v = x2.pop()
# apply this element to random value in list x
x[random.randint(0, len(x)-1)] += v
# print final value of list x
print('step 4:\tx =\t', x)
打印(例如):
step 1: x = [5, 5, 5, 5, 5]
step 2: x2 = [1, 1, 1, 3, 2]
step 3: x = [4, 4, 4, 2, 3]
step 4: x = [5, 4, 4, 8, 4]