Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在3x6表格中随机化5个元素的位置_Arrays_Delphi_Random - Fatal编程技术网

Arrays 在3x6表格中随机化5个元素的位置

Arrays 在3x6表格中随机化5个元素的位置,arrays,delphi,random,Arrays,Delphi,Random,我有5个元素,我想分布到一个3行高,6列宽的表中,没有重叠 位置由[x,y]坐标指定 这些元素的位置随计时器组件的每个刻度而变化 这些元素属于TImage类型 我曾考虑过使用一个点数组,如果在为每个元素赋值的逐步过程中选择了一个点,则会从中删除该点,但我不确定数组是否可以这样工作。您试图做的是从有限集合中均匀采样,而不进行替换 创建一个包含18个可能位置的数组 执行一项任务 洗牌后取前五个位置 由于Fisher-Yates洗牌在第一次迭代后确定第一个值、第二个值和第二次迭代等,因此可以在五次迭代

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

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

这些元素的位置随计时器组件的每个刻度而变化

这些元素属于TImage类型


我曾考虑过使用一个点数组,如果在为每个元素赋值的逐步过程中选择了一个点,则会从中删除该点,但我不确定数组是否可以这样工作。

您试图做的是从有限集合中均匀采样,而不进行替换

  • 创建一个包含18个可能位置的数组
  • 执行一项任务
  • 洗牌后取前五个位置 由于Fisher-Yates洗牌在第一次迭代后确定第一个值、第二个值和第二次迭代等,因此可以在五次迭代后中止洗牌。这种变化称为部分Fisher-Yates洗牌。当从18个中选择5个时,性能增益不是很大,但是想象一下从更多的人群中选择


    对于18个位置,包含前18个整数的数组就可以了。然后,只需使用
    div
    mod
    即可映射到行和列。

    您试图做的是从有限的集合中统一采样,而无需替换

  • 创建一个包含18个可能位置的数组
  • 执行一项任务
  • 洗牌后取前五个位置 由于Fisher-Yates洗牌在第一次迭代后确定第一个值、第二个值和第二次迭代等,因此可以在五次迭代后中止洗牌。这种变化称为部分Fisher-Yates洗牌。当从18个中选择5个时,性能增益不是很大,但是想象一下从更多的人群中选择


    对于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数组