PHP:无重叠的随机位置功能

PHP:无重叠的随机位置功能,php,Php,我有一个块,比如说1000x600,在这个块中,我必须随机填充一个20x20的块,所以总共有1500个 但当我把它们放在一个随机的x,y位置时,我想确保我没有过度写入一个已经分配的块。所以我的问题是,也许有更好的方式来描述我为了完成这项任务所做的事情 代码: $Ypos=0; $Xpos=0; $posStore=[]; $box_size=20; //--这将由另一种方法设定,并将是介于5和1500之间的兰特数 //--但是现在设置为mx。 $number_of_blocks=兰特(51500

我有一个块,比如说1000x600,在这个块中,我必须随机填充一个20x20的块,所以总共有1500个

但当我把它们放在一个随机的x,y位置时,我想确保我没有过度写入一个已经分配的块。所以我的问题是,也许有更好的方式来描述我为了完成这项任务所做的事情

代码:

$Ypos=0;
$Xpos=0;
$posStore=[];
$box_size=20;
//--这将由另一种方法设定,并将是介于5和1500之间的兰特数
//--但是现在设置为mx。
$number_of_blocks=兰特(51500);
//--循环遍历设置的块总数
对于($i=1;$i Ypos=self::randYPos();
$this->Xpos=self::randXPos();
//--检查阵列中是否还没有该位置,否则重新运行此函数
如果(在_数组中([$this->Ypos,$this->Xpos],$this->posStore)){self::SetPosition();}
//--如果确定,则让我们将此位置添加到阵列
数组推送($this->posStore,[$this->Ypos,$this->Xpos]);
//--返回真值
返回true;
}
//--设置YPO
私有函数randYPos(){
$yPos=rand(0,self::IMAGE\u WIDTH);
//--由于框需要相对于其大小(20)/增加其大小进行定位,因此
//--发生重叠
return($yPos%$this->box_size==0)?$yPos:self::randYPos();
}
//--设置XPO
私有函数randXPos(){
$xPos=rand(0,self::IMAGE\u HEIGHT);
//--见ypos解释
return($xPos%$this->box_size==0)?$xPos:self::randXPos();
}
基本上,我所做的是得到一个随机的x,y位置,该位置随框大小的增加而增加,以防止重叠

然后,通过检查定位数组($posStore),我将这两个值传回并检查位置集是否尚未分配,如果没有,则将新的位置数组添加到定位数组($posStore)

但这似乎不起作用,因为如果我喜欢上面设置的总最大值,我仍然在我的主1000x600块空间,似乎有一些位置被覆盖的实例等

有没有更好的方法来写我遗漏了什么

更新

虽然随机回答并没有解决整个问题,但它是帮助我解决问题的一个很好的因素

由于我可能无法完全填充数组,即使洗牌也会显示线性效果,所以我所做的是将数组从0,0填充到总数组

然后,我使用php shuffle进行了shuffle:-)

然后取要求的总数,我简单地做了一个for循环,当他们将总数排列在随机排列的位置时,结果是混合的


感谢您的帮助

您可以将它们按行和列排列,这将使您能够轻松容纳最大数量的框

那就洗牌吧。一个接一个地浏览所有这些内容,然后用随机选择的块切换位置。伪代码:

for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

Source

生成序列空间(数组中的[x,y]对),然后将其删除。

您处理的是
DOM
还是您在服务器端用php创建的某个图像?看起来像是家庭作业。为什么要随机化呢?从逻辑上来说,这就像铺设铺路板,从左上角开始,你知道固定的边界框大小,你知道你的板大小,你可以计算每个板左上角的x和y位置。是的!不是真的,我在函数中调用了一个参数,它必须是线性的或随机的,线性的可以很好地工作,没有问题,它是随机的,它线性地存储在链表或数组中,然后按照生成顺序洗牌?没有重叠,因为你没有考虑部分板,所以只有一种方法来组织它们,只是你的铺设顺序是随机的!就像我的线性方式(将它们添加到一个数组)一样,先进行洗牌,然后进行视觉添加?我觉得它现在应该首先想到这可能会减少呼叫…?感谢提到洗牌,它并没有完全解决我的问题,但它是结尾的一部分,并用于解决我的问题,谢谢。
for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]