寻找平等分配的好算法

时间:2012-11-03 13:15:44

标签: algorithm

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

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

任何人都有更好/更聪明的解决方案?

非常感谢!

4 个答案:

答案 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())) + " ");
    }
}

该算法以下列方式工作:

  1. 创建一个空列表
  2. 使用我们的插槽号填写列表
  3. 随机选择并删除一个插槽,直到没有留下。
  4. 显然只是打印出来的数字并没有多大好处,所以根据需要修改代码。

    示例输出可能是:

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

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

答案 3 :(得分:0)

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

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

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

运行时为O(n²)