如何将随机值从一个元素转移到另一个元素



我想创建一个包含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]

最新更新