在固定网格中获得X个随机点,不重复

  • 本文关键字:随机 网格 random
  • 更新时间 :
  • 英文 :


我正在寻找一种在固定大小的网格中获得X点的方法,比如说m乘N,其中点不会多次返回,所有点都有相似的机会被选中,返回的点数总是X。

我曾想过在所有网格点上循环,并给每个点一个X/(N*M)的随机机会,但我觉得这会给网格中的第一个点更多的优先级。此外,这也不符合总是返回X点的要求。

此外,我可以使用带素数的增量来获得一种没有重复功能的洗牌,但我宁愿它表现得更随机。

本质上,您需要跟踪已经选择的点,并使用随机数生成器来获得伪均匀分布的答案。每个"选择"都应该独立于前一个。

有了你的第一个想法,你是对的,第一个会有更多的机会被选中。考虑一个包含两个元素的一维数组。根据你提到的策略,获得第一个的机会是:

P[x=0] = 1/2 = 0.5

获得第二个的机会是没有获得第一个的机会0.5,乘以1/2:

P[x=1] = 1/2 * 1/2 = 0.25

你没有提到你使用的是哪种编程语言,所以我假设你有一个随机数生成器rand(),它会产生一个范围为[0, 1)的随机浮点、一个Hashmap(或类似的)数据结构和一个Point数据结构。我将进一步假设网格中的一个点可以是任何浮点x,y,其中0 <= x < M0 <= y < N。(如果这是一个NxM数组,则同样适用,但为整数,最高可达(M-1,N-1))。

Hashmap points = new Hashmap();
Point p;
while (items.size() < X) {
p = new Point(rand()*M, rand()*N);
if (!points.containsKey(p)) {
items.add(p, 1);
}
}

注意:xy相等的两个Point对象本身应被视为相等,并生成相等的哈希码等。

最新更新