如何在2D阵列上随机放置2个独特点?

时间:2012-05-04 23:40:27

标签: c++

挑选本身很容易,但我无法确保无法将这些点放在同一位置。我当然可以重新随机,但是有更好的方法吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以通过将2D索引 x,y 线性化为1D i 来实现此目的。

假设您有一个 MxN 大小的2D数组。

[0,MxN)中生成随机整数:

int i1 = rand() % (M * N);

您的2D数组索引将是:

int x1 = i1 % M;
int y1 = i1 / M;

现在生成第二个1D索引,它覆盖了2D数组,但不是之前命中的那个。你可以通过在 [0,MxN-1)中生成一个随机数并用第一个生成的数字传播这个1D索引来做到这一点:

int i2 = (rand() % (M * N - 1) + i1 + 1) % (M * N);

MxN 不是 1x1 时,这两个1D索引总是不同的。

你的第二对2D指数同样如此:

int x2 = i2 % M;
int y2 = i2 / M;

答案 1 :(得分:2)

从N个可能的位置随机选择K个索引相当于首先随机改组数组,然后取第一个K索引。如果你用c ++编程(这是你给出的标签),它可以很简单:

首先,让你的2D数组变平,说它存储在向量中:vector elems;

#include <vector>
#include <algorithm>
using namespace std;

.... initialize elems to whatever you want, here all zeros ......

vector<int> elems (N*M, 0);

// assigning your indices from 0 to elems.size()-1
vector<int> index (elems.size());
for (int i=0; i<index.size(); i++)
{
    index[i] = i;
}

// now random permute
random_shuffle (index.begin(), index.end());

// now assign the elements to whatever you want, here assign them to 1
elems[index[0]] = 1;
elems[index[1]] = 1;

答案 2 :(得分:1)

junjanes几乎有一个解决方案,但实际上并没有阻止两次生成相同的索引。

以这种方式生成i2:

int i2 = rand() % (M * N - 1);
if (i2 >= i1) ++i2;