2010-08-24 70 views
2

如果我有一个由15 x 15个单元(但是变量)组成的网格,我将使用什么公式或算法来随机选择20个聚集在中心单元周围的单元?公式/算法来选择网格中的中心单元格?

我想我会非常希望能够设置中心点,半径集群,密度等等

任何指针将非常感激!干杯。

+0

嗯......你需要选择合适的分布,给每个单元分配一个概率(他们最好加起来为1)。然后,继续抓住0和1之间的随机数,然后选择* right *单元格。当你在(0,0)处的单元格开始时,右边的单元格就是你最终的位置,如果你的rand num大于那个概率,那么移动到下一个单元格,同时也减去那个单元格的概率。这不是最快的方法,但是对于15 x 15来说,这样做会很好。诀窍是选择正确的电网分布,这将有利于中心 - 这取决于你,因为有很多选择。 – 2010-08-24 15:51:52

+0

查看离散分布的cdf vs pdf。 http://en.wikipedia.org/wiki/Discrete_probability_distribution你不需要跳入繁重的数学,只需了解离散分布的cdf和pdf之间的区别。这应该解释为什么你会继续从一个单元格移动到另一个单元格,直到你找到*正确*一个。你如何订购细胞取决于你。你可以按照螺旋状的方式排列它们,然后应用某种三角形分布。你也可以将网格分成几个正方形或圆形,并且说形状上的任何位置的概率都是相同的。 – 2010-08-24 15:57:22

+0

对于15x15左右的网格,您可以手动调整快速且脏的分布 - 只需增加中心的重量即可。如果你可以有很多不同的网格,那么你最好使用一个聪明的公式,但是再一次,它不需要是完美的。你只是想确保在最后“相对概率”“正常化”,这样一切都加起来就是1.例如,在平方(x,y)处的概率可以与1/r成比例,其中r是距离到中心。对于中心本身,你想要承担一些足够高的概率,而不是1/0。当你得到相对号码 – 2010-08-24 16:01:46

回答

3

monte carlo?

<pseudocode>

found=false 
sigma2=3;    // variance 
centrex=8; centrey=8; // centre point 
while !found 
    x=random(15)  //for a 15x15 grid of course! 
    y=random(15) 
    r2=(x-centrex)^2 + (y-centrey)^2 // squared distance to chosen point 
    p=exp(-r2/sigma)     // probability of accepting this point 
    if(p>rand(1)) found=true;  // (calcluated as gaussian distribution) 
end 

</pseudocode>

可以使用在p=线公式选择你的分布。 这里可以使用sigma值来控制分布的传播。例如,对于半径为3的扁平分布,使用p=r2<9

对于高斯,半径和密度在本质上是一样的东西,作为px积分和y必须加起来为1

+0

非常感谢 - 这似乎正是我所追求的! 我只需要添加一个方法来检查重复的单元格,并用不同大小的x和y尺度进行实验 - 这是否会像预期的那样工作,如11 * 15网格还是需要保持平方? – davivid 2010-08-24 17:37:12

+1

它可以与任何大小的网格一起使用,但是按照它的情况,选定单元的分布将保持圆形。为了使它变成椭圆形,在r2中改变比例,即'r2 =((x-centrex)* 15/11)^ 2 +(y-centrey)^ 2'来保持形状。 – 2010-08-24 18:04:05

+1

哦,为了防止重复,您应该跟踪之前选择的项目,并使用布尔15x15数组初始化为false。然后将'found'行改为:if(p> rand(1)&!previouslyChosen [x,y]){found = true; previouslyChosen [X,Y] = TRUE; }' – 2010-08-24 18:07:03

1

圈内的随机性是已知的自相矛盾的问题(参见Bertrand的悖论)。所以你需要考虑如何随机分配点数。选择从0到指定半径的随机距离,并从圆心(网格中心)随机选择一个方向,可能不是您想要的,因为您将在整个区域内分布不均匀(更多集群朝向中央)。我可以计算圆的面积(即:具有指定半径的圆内的单元格),可以将它们存储在临时数组中,并随机选择n个(例如20个)。我不确定这是完全有用的,但主要想法是:随意考虑你的意思。

+0

谢谢,还有更多要考虑的地方!目前上面的答案似乎解决了我的问题 – davivid 2010-08-24 17:42:25

相关问题