-4

私はゲームで忙しく、2D 配列のランダムな場所に数値を配置する必要があります。どうやってやるの?

私は持っている

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

プログラムを実行するとクラッシュします。問題は何でしょうか?

4

2 に答える 2

3

コメントで述べたように、配列はゼロベースであるため、範囲内の数値を生成します[0,n-1]

また、割り当てではなく比較しています( に注意してください==

また、より最新の乱数発生器を使用してください。それらは、正しい分布を生成するという意味で優れているだけでなく、はるかに使いやすくなっています (算術操作が不要になります)。たとえば、C++11 の randomを使用すると、次のようになります (これは、c++03 より前のブーストでも実現できます)。

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' 回割り当てたい場合は、ループから0to N( Ncould be rows*cols)にするだけです。

于 2012-05-03T19:22:51.407 に答える
1

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

最初の要素の位置が 1 ではなく 0 であるため、正しくありません。

試すarray[rand() % row][ rand() % col]

EDIT : からまでrand() % nの数字を返します。あなたの場合、1を追加すると、有効なインデックスではない位置または位置にある要素にアクセスしようとすることが可能になります。そして書いたとしても0n-1rowcol

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

最初の行と最初の列の両方が決して触れられないため、真にランダムではありません。

于 2012-05-03T19:13:09.687 に答える