我正在寻找一种在固定大小的网格中获得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 < M
和0 <= 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);
}
}
注意:x
和y
相等的两个Point
对象本身应被视为相等,并生成相等的哈希码等。