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