私はゲームで忙しく、2D 配列のランダムな場所に数値を配置する必要があります。どうやってやるの?
私は持っている
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
array[1 + rand() % row][1 + rand() % col] == 5;
}
}
プログラムを実行するとクラッシュします。問題は何でしょうか?
私はゲームで忙しく、2D 配列のランダムな場所に数値を配置する必要があります。どうやってやるの?
私は持っている
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
array[1 + rand() % row][1 + rand() % col] == 5;
}
}
プログラムを実行するとクラッシュします。問題は何でしょうか?
コメントで述べたように、配列はゼロベースであるため、範囲内の数値を生成します[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' 回割り当てたい場合は、ループから0
to N
( N
could be rows*cols
)にするだけです。
array[1 + rand() % row][1 + rand() % col]
最初の要素の位置が 1 ではなく 0 であるため、正しくありません。
試すarray[rand() % row][ rand() % col]
EDIT :
からまでrand() % n
の数字を返します。あなたの場合、1を追加すると、有効なインデックスではない位置または位置にある要素にアクセスしようとすることが可能になります。そして書いたとしても0
n-1
row
col
array[1 + rand() % (row-1)][1 + rand() % (col-1)]
最初の行と最初の列の両方が決して触れられないため、真にランダムではありません。