我想创建一个包含10000个元素的列表,每个元素将一个值传递给另一个随机选择的元素,并重复100000次(或更多(。可以分配传递值的分布(例如正态或对数正态等(。
我能想到的是使用一个循环并分配另一个列表来保存传输值。
考虑到跑步的时间可能很长,有没有办法有效地完成这项工作?
例如: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]
,x2[0]
到x[3]
,而x[4]
没有发生任何事情(这是一个示例,因为所有事情都是随机的(。
我的当前代码如下所示,具有固定值,在选择过程中不能排除x[I]。
import random
x = [5]*5
x2 = []
# Change the values in list x, and create list x2 to store the changes.
for i in range(len(x)):
rand_i = random.randint(1,4)
x[i] = x[i]-rand_i
x2 = x2+[rand_i]
# Randomly add values in list x2 to elements in list x.
# Do not add x2[i] to x[i].
for i in range(len(x2)):
ii = random.randrange(len(x2))
x[ii] = float(x[ii]) + float(x2[i])
print(sorted(x))
希望我已经正确理解了算法。解释在代码的注释中:
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]