在3x6表

时间:2016-03-20 20:09:29

标签: arrays delphi random

我有5个元素,我想分配到3行高,6列宽的表中,没有重叠。

位置由[x,y]坐标指定。

这些元素的位置随着Timer组件的每个滴答而变化。

元素属于TImage类型。

我想过有一个点数组,如果在为每个元素分配值的分步过程中选择了一个点,那么它就会被删除,但是我不确定数组是这样工作的。

2 个答案:

答案 0 :(得分:5)

您要做的是从有限集中均匀采样,无需替换。

  1. 创建一个包含18个可能位置的数组。
  2. 执行Fisher-Yates shuffle
  3. 改组后取前五个位置。
  4. 由于Fisher-Yates shuffle确定第一次迭代后的第一个值,第二个值和第二个迭代,依此类推,您可以在五次迭代后中止shuffle。这种变化被称为部分Fisher-Yates shuffle。从18中选择5时的性能提升并不是很好,但想象一下从更大的人口中选择。

    对于您的18个位置,包含前18个整数的数组将会这样做。然后,只需使用divmod即可映射到行和列。

答案 1 :(得分:0)

当有更多的可用空间而不是元素时,最简单的方法非常有效并且可以正确分配:

  

随机选择点,如果它已经被占用,再次选择它,直到你得到空置的单元格。

这是Monte-Carlo中经常使用的方法的简单变体,称为拒绝抽样(https://en.wikipedia.org/wiki/Rejection_sampling)。

相关问题