我有5个元素,我想分配到3行高,6列宽的表中,没有重叠。
位置由[x,y]坐标指定。
这些元素的位置随着Timer组件的每个滴答而变化。
元素属于TImage类型。
我想过有一个点数组,如果在为每个元素分配值的分步过程中选择了一个点,那么它就会被删除,但是我不确定数组是这样工作的。
答案 0 :(得分:5)
您要做的是从有限集中均匀采样,无需替换。
由于Fisher-Yates shuffle确定第一次迭代后的第一个值,第二个值和第二个迭代,依此类推,您可以在五次迭代后中止shuffle。这种变化被称为部分Fisher-Yates shuffle。从18中选择5时的性能提升并不是很好,但想象一下从更大的人口中选择。
对于您的18个位置,包含前18个整数的数组将会这样做。然后,只需使用div
和mod
即可映射到行和列。
答案 1 :(得分:0)
当有更多的可用空间而不是元素时,最简单的方法非常有效并且可以正确分配:
随机选择点,如果它已经被占用,再次选择它,直到你得到空置的单元格。
这是Monte-Carlo中经常使用的方法的简单变体,称为拒绝抽样(https://en.wikipedia.org/wiki/Rejection_sampling)。