C ++随机生成的数字

时间:2012-05-03 19:08:29

标签: c++ random multidimensional-array

我忙于游戏,需要在数组上的随机位置将数字放入2D数组中。我怎么能这样做?

我有

for(int i = 0; i < rows; i++)
{
   for(int j = 0; j < cols; j++)
   {
      array[1 + rand() % row][1 + rand() % col] == 5;
   }
}

运行时我的程序崩溃了。问题是什么?

2 个答案:

答案 0 :(得分:3)

如评论中所述,数组从零开始,因此您生成的数字范围为[0,n-1]

此外,您正在比较而不是分配(请注意==

此外,使用更现代的随机生成器,它们不仅在产生正确的分布方面更好,而且更容易使用(不再算术)。例如,对于C++11's random,您将拥有以下内容(对于pre-c ++ 03,这也可以使用boost实现):

std::mt19937 gen(std::random_device{}());
std::uniform_int_distribution<> disRows(0, rows-1);
std::uniform_int_distribution<> disCOls(0, cols-1);
for(int i = 0; i < rows; i++)
{
   for(int j = 0; j < cols; j++)
   {
      array[disRows(gen)][disCols(gen)] = 5;
   }
}

此外,双循环在这里没有多大意义,如果你想随机分配5'N'次,只需从0循环到NN即可rows*cols

答案 1 :(得分:1)

array[1 + rand() % row][1 + rand() % col]

不正确,因为第一个元素位于0位,而不是1。

尝试array[rand() % row][ rand() % col]

编辑: rand() % n会将0的数字返回给n-1。在您添加1的情况下,可以尝试访问位置rowcol的元素,这些元素不是有效索引。即使你写了

array[1 + rand() % (row-1)][1 + rand() % (col-1)]

它不是真正随机的,因为永远不会触及第一行和第一列。