挑选本身很容易,但我无法确保我不能将点放在同一个地方。我当然可以重新随机,但有更好的方法吗?非常感谢!
问问题
1199 次
3 回答
2
您可以通过将 2D 索引x,y线性化为1D i来做到这一点。
假设您有一个MxN大小的二维数组。
在[0, MxN)中生成一个随机整数:
int i1 = rand() % (M * N);
您的二维数组索引将是:
int x1 = i1 % M;
int y1 = i1 / M;
现在生成第二个 1D 索引,该索引覆盖 2D 数组,但不是您之前点击的那个。您可以通过在[0, MxN-1)中生成一个随机数并通过第一个生成的数字循环这个一维索引来做到这一点:
int i2 = (rand() % (M * N - 1) + i1 + 1) % (M * N);
当然,当MxN不是1x1时,这两个 1D 索引总是不同的。
您的第二对二维索引类似:
int x2 = i2 % M;
int y2 = i2 / M;
于 2012-05-05T00:20:59.683 回答
2
从 N 个可能的位置随机选择 K 个索引相当于首先随机洗牌数组,然后取前 K 个索引。如果你用 c++ 编程(这是你作为标签给出的),它可以很简单:
首先,让你的二维数组变平,比如说它存储在一个向量中: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;
于 2012-05-05T00:34:59.190 回答
1
junjanes 几乎有一个解决方案,但实际上并不能阻止两次生成相同的索引。
以这种方式生成 i2:
int i2 = rand() % (M * N - 1);
if (i2 >= i1) ++i2;
于 2012-05-05T00:24:40.600 回答