我正在开发一个应用程序,其中很多报纸剪报应该在桌子上随机“抛出”。 但是,如果使用真随机,则总有可能所有剪辑出现在一个地方。 客户更喜欢更“平等”的随机分布。
我的一个解决方案是: 如果我有20个剪报,计算一个包含20个字段的网格,然后将每个剪辑放在该字段中具有随机x / y位置的字段中。
任何人都有更好/更聪明的解决方案?
非常感谢!
答案 0 :(得分:1)
这是我要做的......
因为它是剪报,我认为视觉部分也很重要......
我会将表格分成4个部分(表面相等)和一个表示表格中心的(重叠)部分。你总是可以玩4号并使它成为6或8但我不会高达20。
现在你将剪辑分成5个部分的随机x / y位置。
像这样你将永远拥有一个“强大”的桌子中心,但你保证不是所有的剪报都在一堆。
答案 1 :(得分:1)
您正在寻找的是被称为准随机序列(或低差异序列)。有几个众所周知的序列,这里是Wikipedia entry。根据您选择的语言,可能会提供随时可用的库(此问题中提到了几个示例:Recommendations for Low Discrepancy (e.g. Sobol) quasi-random sequences in Python/SciPy?)。
答案 2 :(得分:0)
解决此问题的最简单方法可能是将其展平为线性对象。 4 x 5的网格可以成为20的列表。只需给每个'slot'一个数字(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
注意:此算法在多次迭代中提供所有“插槽”的均匀分布。
答案 3 :(得分:0)
这是一种非常简单的蛮力方法:
基本上,你总是尝试多个点,并且只选择距离所有先前选择点最远的点。
运行时为O(n²)