【问题标题】:Looking for good algorithm for equal distribution寻找均衡分布的好算法
【发布时间】:2012-11-03 13:15:44
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • 这是一个很好、快速的方法。
  • 我同意,但请记住,您需要在每个字段内均匀分布,否则您将得到“一堆堆的网格”。

标签: algorithm


【解决方案1】:

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

【讨论】:

  • 好的,谢谢 会调查一下,看起来非常完美。现在我也知道它是怎么称呼的了。
【解决方案2】:

这就是我要做什么......

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

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

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

这样,您的桌子将始终有一个“坚固”的中心,但您保证并非所有剪报都在一堆。

【讨论】:

    【解决方案3】:

    这是一个非常简单的暴力破解方法:

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

    基本上,您总是会尝试多个点,然后只选择离所有先前选择的点最远的一个。

    运行时间为 O(n²)

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多