Arrays 在3x6表格中随机化5个元素的位置
我有5个元素,我想分布到一个3行高,6列宽的表中,没有重叠 位置由[x,y]坐标指定 这些元素的位置随计时器组件的每个刻度而变化 这些元素属于TImage类型Arrays 在3x6表格中随机化5个元素的位置,arrays,delphi,random,Arrays,Delphi,Random,我有5个元素,我想分布到一个3行高,6列宽的表中,没有重叠 位置由[x,y]坐标指定 这些元素的位置随计时器组件的每个刻度而变化 这些元素属于TImage类型 我曾考虑过使用一个点数组,如果在为每个元素赋值的逐步过程中选择了一个点,则会从中删除该点,但我不确定数组是否可以这样工作。您试图做的是从有限集合中均匀采样,而不进行替换 创建一个包含18个可能位置的数组 执行一项任务 洗牌后取前五个位置 由于Fisher-Yates洗牌在第一次迭代后确定第一个值、第二个值和第二次迭代等,因此可以在五次迭代
我曾考虑过使用一个点数组,如果在为每个元素赋值的逐步过程中选择了一个点,则会从中删除该点,但我不确定数组是否可以这样工作。您试图做的是从有限集合中均匀采样,而不进行替换
对于18个位置,包含前18个整数的数组就可以了。然后,只需使用
div
和mod
即可映射到行和列。您试图做的是从有限的集合中统一采样,而无需替换
对于18个位置,包含前18个整数的数组就可以了。然后,只需使用
div
和mod
即可映射到行和列上。当可用空间远大于元素时,最简单的方法非常有效,并提供正确的分布:
随机选取一个点,若它已经被占用,那个么再选取一次,直到你们得到一个未被占用的单元
这是蒙特卡罗常用方法的简单变体,称为拒绝抽样()。当自由空间远大于元素时,最简单的方法非常有效,并给出正确的分布: 随机选取一个点,若它已经被占用,那个么再选取一次,直到你们得到一个未被占用的单元
这是蒙特卡罗常用方法的简单变化,称为拒绝采样()。这实际上是我曾经尝试过的,但当算法确实发现第二个元素重叠时,我遇到了一个问题,即第二个元素消失了,而没有分配到不同的位置,因为整个过程只能在计时器计时期间发生一次(在Delphi中开发)。@Tallmios使用repeat..till在计时器的事件处理程序中循环,因此您可以找到每个新元素的正确位置。@Tallmios显然您的代码是错误的,但您没有显示它。这就是概念性的答案。我敢打赌,所有东西都混合到了TForm子代的GUI代码中。经过适当分解的代码使这些问题变得简单。由缠结的线组成的大意大利面球不是。我认为这对于大量人群来说是很好的,几乎没有重叠的机会,但对于18人的人群来说不是。拒绝抽样在这里是完全合理的。执行拒绝的最干净的方法可能是为所有18个候选对象维护一个状态数组。在这一点上,使用一个可能稍微优雅一点的部分洗牌并不需要太长时间。但至少对我来说,这两种方法都是完全可以接受的。这实际上是我尝试过的一次,但当算法确实发现第二个元素重叠时,我遇到了一个问题,即第二个元素在没有被分配到不同位置的情况下消失了,因为整个过程只能在计时器的滴答声中发生一次(在Delphi中开发).@Tallmios使用repeat..till在计时器的事件处理程序中循环,以便为每个新元素找到正确的位置。@Tallmios显然您的代码是错误的,但您没有显示它。这就是概念性的答案。我敢打赌,所有东西都混合到了TForm子代的GUI代码中。经过适当分解的代码使这些问题变得简单。由缠结的线组成的大意大利面球不是。我认为这对于大量人群来说是很好的,几乎没有重叠的机会,但对于18人的人群来说不是。拒绝抽样在这里是完全合理的。执行拒绝的最干净的方法可能是为所有18个候选对象维护一个状态数组。在这一点上,使用一个可能稍微优雅一点的部分洗牌并不需要太长时间。但至少对我来说,这两种方法都是完全可以接受的。非常感谢你的建议,但我在创建阵列时遇到了麻烦。获取一个错误,我的元素数与声明的数不同:--pozice:integer=((50210370530690850),(45200355))的数组[1..6,1..3];那对我来说毫无意义。您需要一个长度为18的1D数组。该数组初始化为0到17。然后洗牌,取前5个条目。用div 6和mod 6映射到row/col。我知道我应该在其中放置位置,但坐标是什么?按照我解释的方式进行。或者,如果这太难了,可以声明一个包含行和列的记录,一个包含所有行和列的数组,然后将它们洗牌。不过我想你还不明白洗牌是什么。非常感谢你的建议,但我在创建阵法时遇到了麻烦。获取一个错误,我的元素数与声明的数不同:--pozice:integer=((50210370530690850),(45200355))的数组[1..6,1..3];那对我来说毫无意义。您需要一个长度为18的1D数组