5

我正在开发一个应用程序,其中应将大量剪报随机“扔”在 y 桌子上。但是,如果使用真正的随机,则总是有可能所有剪辑都出现在一个地方。客户更喜欢更“平等”的随机分布。

我的解决方案之一是:如果我有 20 个剪辑,计算一个包含 20 个字段的网格,然后将每个剪辑放在一个字段中,该字段中具有随机 x/y 位置。

有人有更好/更聪明的解决方案吗?

多谢!

4

4 回答 4

2

您正在寻找的内容被称为准随机序列(或低差异序列)。有几个像这样的众所周知的序列,这里是Wikipedia entry。根据您选择的语言,可能会提供现成的库(此问题中提到了几个示例:Recommendations for Low Discrepancy (eg Sobol) quasi-random sequences in Python/SciPy?)。

于 2012-11-03T14:16:23.773 回答
1

在这里我会做什么......

因为它是关于剪报,我认为视觉部分也很重要......

我会将表格分为 4 个部分(表面相等)和一个代表表格中心的(重叠)部分。你总是可以玩 4 的数字,让它变成 6 或 8,但我不会高达 20。

现在,您将剪报在 5 个部分的随机 x/y 位置进行划分。

像这样,你的桌子总是有一个“坚固”的中心,但你保证不是所有的剪报都在一堆。

于 2012-11-03T13:25:47.440 回答
0

也许解决这个问题的最简单方法是将其展平为线性对象。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())) + " ");
    }
}

该算法以下列方式工作:

  1. 创建一个空列表
  2. 用我们的插槽号填写列表
  3. 随机选择并删除一个插槽,直到没有剩余。

显然,仅仅打印出数字并没有多大用处,因此请根据需要修改代码。

一个示例输出可能是:

15 9 17 13 8 10 6 11 3 7 2 19 4 0 12 18 16 5 1 14 

注意:该算法在多次迭代中提供了跨所有“槽”的均匀分布。

于 2013-12-17T21:04:23.810 回答
0

这是一个非常简单的蛮力方法:

  • 保留您已经选择的点的列表。
  • 选择 n 个随机点
  • 在其中选择与列表中所有点的最小距离最大的点,丢弃其他点
  • 将该点添加到您选择的点列表中
  • 重复直到你有足够的分数

基本上,您总是尝试多个点,并且只选择与所有先前选择的点最远的一个。

运行时间为 O(n²)

于 2013-12-17T21:45:24.440 回答