Random 在固定网格中不重复地获取X个随机点

Random 在固定网格中不重复地获取X个随机点,random,Random,我正在寻找一种在固定大小的网格(比如m×N)中获得X点的方法,在该网格中,点不会被多次返回,所有点都有相似的机会被选中,并且返回的点数始终是X 我的想法是在所有网格点上循环,给每个点一个X/(N*M)的随机机会,但我觉得它会给网格中的第一个点更多的优先级。这也不符合总是返回X个点数的要求 我也可以使用素数的增量来获得某种洗牌,而不需要重复功能,但我更希望它表现得更随机。本质上,你需要跟踪你已经选择的点,并使用随机数生成器来获得伪均匀分布的答案。每个“选择”都应该独立于前一个 有了你的第一个想法,

我正在寻找一种在固定大小的网格(比如m×N)中获得X点的方法,在该网格中,点不会被多次返回,所有点都有相似的机会被选中,并且返回的点数始终是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)
内的随机浮点、哈希映射(或类似)数据结构,以及
数据结构。我将进一步假设网格中的点可以是任何浮点
x,y
,其中
0哪种编程语言?
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);
    }
}