【问题标题】:C++ Random Generated NumbersC++ 随机生成数
【发布时间】:2012-05-03 19:08:28
【问题描述】:

我正忙于玩游戏,需要将一个数字放入二维数组中的随机位置。我该怎么做?

我有

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

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

【问题讨论】:

  • 显示array的声明。
  • 数组是从 0 开始的,而不是从 1 开始的。
  • 另外,您使用的是 == 而不是赋值 = 这只是一个错字,还是您的真实代码?
  • 并且赋值是迭代 rows*cols 次,所以你最终会得到一个随机数为 5s 的矩阵。
  • 这些循环没有意义,您甚至不使用ij(对于每个单元格,您选择另一个随机单元格)

标签: c++ random multidimensional-array


【解决方案1】:

正如 cmets 中所说,数组是从零开始的,因此您可以生成 [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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    这并不是真正的随机,因为第一行和第一列都不会被触及。

    【讨论】:

    • 问题是如何将值 5 放置在数组中的随机位置。
    • 如果rand() % row返回row-1,那么1 + rand() % row就是row,超出范围。
    • 是的,我明白了,现在它不会在数组中显示 5,它不会给我错误
    • @JonathanGeers:查看我的回答或阅读关于您问题的第三条评论,您使用== 而不是=
    猜你喜欢
    • 2012-03-18
    • 2015-07-19
    • 2011-01-24
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多