正方形上的随机均匀点分布(带有捕获)

时间:2011-10-19 11:47:09

标签: algorithm random uniform

好的,所以通过一些众所周知的算法(Hammersley,Monte Carlo等)解决了均匀点分布的问题。但是,我的情况有点不同:假设我设置了 a 值(2,8,1,5,4,7,3,6)。这些值按索引顺序访问(从2开始)。如果它们映射在x轴上(通过访问模式,即0为2,1为8),我必须找到它们对应的y值,这样:

  • 整个点集(考虑x和y坐标)低差异序列;
  • 任何一对x值(输入集)必须具有相应的y值,它们之间的距离最大;

结果是另一组 b ,其中混合整数[1..8]为第一个,因此每个元组(ai,bi)都遵循上述两个规则。

总结一下:我有一个轴上的分布(无论哪一个),需要在另一个轴上找到分布,这样连续点在被访问时彼此相距很远但总体而言,形成一个均匀的分布在整个广场上。

案例

给定4个元素(3,1,4,2)的输入集,一个好的结果集是(xy合并):((3,1),(1,4),(4,2),( 2,3))它很好,因为当你访问点(从3,1到结束)时,你访问的每一个新点都会在两个轴上实现一个很大的飞跃,这就是目标以及整体平等分配。相同输入集的错误结果情况是:((3,1),(1,2),(4,3),(2,4)),因为现在我们连续访问y值(尽管x值正常)

这是填写预先计算的表格所需的全部,该表格将用于采样,因此任何最终算法的速度无关紧要(当然,只要它不需要2年)。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用分而治之的策略来实现这一目标。基本上,如果你想要1:n的排列,那么创建一个1:n / 2和(n / 2 + 1):n的排列,并随机散布它们。

以下是如何随机散布它们的方法:

function permute(x,y):
    L1 = permute(x, (x+y)/2)
    L2 = permute((x+y)/2+1, y)
    spin = randomlyselectfrom(-1,1)
    L = []
    while L1 and L2 are not empty:
        if spin<0:
            L.enqueue(L1.dequeue)
        else:
            L.enqueue(L2.dequeue)
        if random()<0.9:
            spin = -spin
    return L

我没有检查边界条件等,如果你不知道如何照顾那部分,请随时问我。

一旦你以上述方式得到两个随机序列,反转其中一个并将它们配对,你就会得到你需要的对序列。