我正在开发一个应用程序,其中应将大量剪报随机“扔”在 y 桌子上。但是,如果使用真正的随机,则总是有可能所有剪辑都出现在一个地方。客户更喜欢更“平等”的随机分布。
我的解决方案之一是:如果我有 20 个剪辑,计算一个包含 20 个字段的网格,然后将每个剪辑放在一个字段中,该字段中具有随机 x/y 位置。
有人有更好/更聪明的解决方案吗?
多谢!
我正在开发一个应用程序,其中应将大量剪报随机“扔”在 y 桌子上。但是,如果使用真正的随机,则总是有可能所有剪辑都出现在一个地方。客户更喜欢更“平等”的随机分布。
我的解决方案之一是:如果我有 20 个剪辑,计算一个包含 20 个字段的网格,然后将每个剪辑放在一个字段中,该字段中具有随机 x/y 位置。
有人有更好/更聪明的解决方案吗?
多谢!
您正在寻找的内容被称为准随机序列(或低差异序列)。有几个像这样的众所周知的序列,这里是Wikipedia entry。根据您选择的语言,可能会提供现成的库(此问题中提到了几个示例:Recommendations for Low Discrepancy (eg Sobol) quasi-random sequences in Python/SciPy?)。
在这里我会做什么......
因为它是关于剪报,我认为视觉部分也很重要......
我会将表格分为 4 个部分(表面相等)和一个代表表格中心的(重叠)部分。你总是可以玩 4 的数字,让它变成 6 或 8,但我不会高达 20。
现在,您将剪报在 5 个部分的随机 x/y 位置进行划分。
像这样,你的桌子总是有一个“坚固”的中心,但你保证不是所有的剪报都在一堆。
也许解决这个问题的最简单方法是将其展平为线性对象。4 x 5 的网格可以变成 20 个列表。只需给每个“插槽”一个数字 (0 - 19) 并使用以下算法。希望你不介意Java。
private void randomSlotFiller(int numberOfSlots) {
List<Integer> list = new ArrayList<Integer>();
Random random = new Random();
for (int i = 0; i < numberOfSlots; i++) {
list.add(i);
}
while(!list.isEmpty()) {
System.out.print(list.remove(random.nextInt(list.size())) + " ");
}
}
该算法以下列方式工作:
显然,仅仅打印出数字并没有多大用处,因此请根据需要修改代码。
一个示例输出可能是:
15 9 17 13 8 10 6 11 3 7 2 19 4 0 12 18 16 5 1 14
注意:该算法在多次迭代中提供了跨所有“槽”的均匀分布。
这是一个非常简单的蛮力方法:
基本上,您总是尝试多个点,并且只选择与所有先前选择的点最远的一个。
运行时间为 O(n²)