【问题标题】:algorithm to evenly space objects across containers将对象均匀分布在容器之间的算法
【发布时间】:2017-07-07 11:09:23
【问题描述】:

我有一排 12 个杯子,我会收到随机数量的球放入这些杯子中。我可以收到 1 到 12 个球(含)。无论我收到多少球,我都希望将它们均匀地分布在杯子的线上。每个杯子只能装一个球。

“偶数”的概念有待商榷。例如,如果我得到 6 个球,我可以将它们隔开一个杯子,但是如果我得到 7 个球,那么第 7 个球的位置对我来说并不是很重要,只要它遵循逻辑模式即可。同样,当我只有 5 个球时,球之间的额外空间的位置对我来说也不重要。

那么,有人熟悉这种分布算法吗?我拼凑了一些东西,但它太糟糕了,以至于它永远也见不到曙光。

【问题讨论】:

  • 如果你是一名游戏程序员:老实说,做到这一点的最好方法就是拥有一个“缓存”(它是如此简单,你几乎不能称之为它)。只有 12 个解决方案。只需将它们全部写出来(例如,有一个数组)。在运行时只需选择并使用解决方案。
  • 你想要这个吗? jsfiddle.net/k0r18yba

标签: algorithm


【解决方案1】:

通常如果你得到 N 个球,你会将 ith 个球(从零开始计数)放入桶 floor((i+0.5)*12 /N)(也从零开始计数),或类似的东西

【讨论】:

    【解决方案2】:

    正如马特已经说过的,只是 .. 一个非常简单的解决方案是,如果球是 B,则取最接近 B 的整数加上一半乘以 12 除以运行中的球数。


    更聪明的方法是:拿一个球;你甚至不必知道总共有多少个球。找到最长的球洞:将球放在该球洞中的随机位置。重复这个直到你用完球。随着时间的推移,它们会以随机的方式均匀分布,并且,呃,看起来是“随机的”。如果您有很多插槽和很多球,这就是您的做法。有趣的是,您可以将其抽象为多个维度。

    【讨论】:

      【解决方案3】:

      对不起,我不能用英语告诉你。但我可以在代码和数学方面提供帮助。

      F(x,b)  ->  {0,1}
      x € [0,11] , b  € [1,12]  
      

      F (x,b) is : 这是蓝盒或白盒函数。 x 是盒子; b 是球。

      int F(x,b){
         if (    (int)(x % 12/b)   == 0 ) return 1;
         else return 0;
      }
      

      **第二种方式*

      float i = 0;
      int b = 1; // Balls
      while(i<12){
         printf( '%d. box', (int) i);
         i +=  (float)12 /(float)b ;
      }
      

      你可以在https://jsfiddle.net/k0r18yba/看到这个算法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2011-04-04
        • 1970-01-01
        相关资源
        最近更新 更多