我有如下随机抽样方法:
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()在这种情况下不起作用,因为它会在生成数组后更改数组的顺序,并且每个数字之间的逻辑也会更改。我希望它按顺序随机列出列表中的数字,这样可以将逻辑保持在数字序列中。我该怎么办?
答案 0 :(得分:1)
如果数组不足,则只要违反约束,您就可以简单地生成整个数组,对其进行排序,拒绝并重新生成。
Service
如果bad = True
while bad:
arr = np.sort(np.random.rand(size))
bad = np.any(np.ediff1d(arr) < 0.05)
太大,则冲突将非常丰富,并且这将永远持续下去,因此仅在有合理机会随机生成一致数组的情况下才使用它。请注意,如果size
没有符合条件的数组,则将其变成无限循环。
另一种方法是如上所述生成和排序数组,找到不合格元素对,然后通过增加不合格元素对之间的距离并从其他位置平均减去此差来微调数组元素。这不会陷入无限循环,但会带来更多数学运算并弯曲均匀分布(尽管我无法告诉您多少)。
编辑经过一番思考,有一种更好的方法。基本上,您需要一个有间隔的数组,其中有一个固定的间隔符,并且每个元素之间都有一些额外的随机性:
size > 20
所有空间必须加起来为1。但是,其中一些空间是固定的(random start space
[element1]
0.05 spacer
some more space
[element2]
0.05 spacer
some more space
[element3]
random end space
);因此,如果我们取出固定的垫片,我们就有“空间预算”在开始,结束和随机空间之间分配。因此,我们生成随机空间,然后对其进行一些打孔,以便将其总计为我们的空间预算。然后添加固定的间隔符,累积的总和将为我们提供最终的数组(最后还有一个额外的(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
,您会开始超出0 ... 1的范围,因为从数学上讲,不可能在该间隔内填充超过21 0.05个间隔符。