我有一个随机抽样方法如下:
def costum_random_sample(size):
randomList = []
counter = 0
last_n = -1
while(size != counter):
n = random.random()
if abs(n - last_n) < 0.05:
continue
else:
randomList.append(n)
counter += 1
last_n = n
return np.array(randomList)
结果是这样的阵列([0.50146945,0.17442673,0.60011469,0.13501798])。现在,我想更改它以使其按顺序排列喜欢数组。 Sort()在这种情况下不起作用,因为它在生成数组后更改了数组的顺序,并且更改了每个数字之间的逻辑。我希望它按顺序随机列出数字,通过这种方式它可以保持数字序列中的逻辑。我怎样才能做到这一点?
如果你的数组是短的,你可以简单地生成整个数组,对它进行排序,并拒绝它,并在违反约束时重新生成。
bad = True
while bad:
arr = np.sort(np.random.rand(size))
bad = np.any(np.ediff1d(arr) < 0.05)
如果size
太大,冲突就会太多,这将需要永远,所以只有在有合理的机会才能随机生成一致的数组时才使用它。请注意,如果size > 20
没有符合条件的数组,则将其转换为无限循环。
另一种方法是如上所述生成和排序数组,找到不符合元素对,然后通过增加非合格对之间的距离并从其他位置均匀地减去这种差异来微移数组元素。这不能陷入无限循环,但有更多的数学,并弯曲均匀分布(虽然我不能告诉你多少)。
编辑在思考了一下之后,有一个更好的方法。基本上,你需要一个间隔的数组,其中有一个固定的间隔和每个元素之间的一点点额外的随机性:
random start space
[element1]
0.05 spacer
some more space
[element2]
0.05 spacer
some more space
[element3]
random end space
所有空间需要加起来1.然而,一些空间是固定的((size - 1) * 0.05
);因此,如果我们拿出固定的垫片,我们就可以在开始,结束和随机空间之间分配“空间预算”。因此,我们生成随机空间,然后将其打孔,以便总结到我们的空间预算。然后加入固定的垫片,累积和将给我们最后的数组(最后一个额外的1.0
,我们砍掉)。
space_budget = 1 - (size - 1) * 0.05
space = np.random.rand(size + 1)
space *= space_budget / np.sum(space)
space[1:-1] += 0.05
arr = np.cumsum(space)[:-1]
对于size = 21
,你每次都得到一个解,因为space_budget
为零。对于较大的size
,你开始突破0 ... 1范围,因为在数学上不可能在这个区间内填充超过21 0.05个间隔。