新的和改进的 ;-)
感谢 Guillaume 和 Jason S 的评论让我思考更多。这产生了第二个提案,其统计数据显示出显着改善。
Guillaume 说我之前发布的策略会失去均匀的密度。当然,他是对的,因为它本质上是一种倾向于绕原点运行的“醉汉行走”。然而,点的均匀随机放置产生了不符合“路径”要求的显着概率(所有点都可以通过不大于 100 步长的路径连接)。测试这种情况很昂贵;生成纯随机解决方案直到通过一次更是如此。
Jason S 提供了一个变体,但对大量模拟的统计测试使我得出结论,他的变体产生的模式与我的第一个提案中的模式一样聚集(基于检查坐标值的平均值和标准偏差)。
下面修改后的算法产生的点集的统计数据与纯(均匀)随机放置的统计数据非常相似,但通过构造保证满足路径要求。不幸的是,形象化比口头解释要容易一些。实际上,它要求点在一个模糊一致的方向(NE、SE、SW、NW)上随机交错,只有在“从墙上反弹”时才会改变方向。
这是高级概述:
随机选择一个初始点,将水平行程设置为 RIGHT,垂直行程设置为 DOWN。
对剩余的点数重复(例如原始规范中的 99):
2.1。随机选择距离在 50 到 100 之间的 dx 和 dy。(我假设欧几里得距离——平方和的平方根——在我的试验实现中,但“出租车”距离——绝对值之和——会更容易编码。)
2.2. 根据水平和垂直行程(右/下 -> 加,左/上 -> 减)将 dx 和 dy 应用于前一点。
2.3. 如果任一坐标超出范围(小于 0 或至少 1000),则在违反的边界周围反射该坐标,并将其行进替换为相反方向。这意味着四种情况(2 个坐标 x 2 个边界):
2.3.1. if x < 0, then x = -x and reverse LEFT/RIGHT horizontal travel.
2.3.2. if 1000 <= x, then x = 1999 - x and reverse LEFT/RIGHT horizontal travel.
2.3.3. if y < 0, then y = -y and reverse UP/DOWN vertical travel.
2.3.4. if 1000 <= y, then y = 1999 - y and reverse UP/DOWN vertical travel.
请注意,步骤 2.3 下的反射保证将新点留在前一点的 100 个单位内,因此保留了路径要求。然而,水平和垂直旅行的限制迫使点的生成随机地“扫过”整个空间,比原来的纯“酒鬼走路”算法产生更多的总分散。