2012-05-03 34 views
-4

私はゲームで忙しく、配列の任意の場所に2次元配列に数値を配置する必要があります。どうやってやるの?C++ランダム生成番号

私はそれを実行したとき、私は

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

私のプログラムがクラッシュを持っています。何が問題なの? 0から rand() % n戻っ番号をn-1に:最初の要素がない1.

、位置0であるarray[rand() % row][ rand() % col]

EDITしてみてくださいので

+4

'array'の宣言を表示します。 – ildjarn

+6

配列は0から始まり、1から始まるわけではありません。 –

+3

また、あなたは '=='を使用していますが、 '='という代入ではありません。これはちょうどタイプミスでしたか、これはあなたの本当のコードですか? –

答えて

1

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

が正しくありません。あなたの場合、1を追加すると、有効なインデックスではない位置rowまたはcolの要素にアクセスすることができます。あなたは

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

を書いた場合でも、1行1列の両方が触れたことはありませんよう、それが真にランダムではありません。

+0

質問はどのように配置するのですか? –

+0

'rand()%row'が' row-1'を返す場合、 '1 + rand()%row'は'行 'です。 – UmNyobe

+0

はい私はそれを得て、それは私にエラーを与えません今すぐそれは配列の5を表示しません –

3

コメントで述べたように、配列は0から始まり、[0,n-1]の範囲の数値を生成します。

また、あなたが割り当てるのではなく、比較している、彼らは正しい分布を生成するという意味ではないだけ優れている、より近代的な乱数発生器を使用し、また

==に注意してください)が、多くのも簡単使用する(これ以上の算術演算はしない)。例えば、C++11's randomで、あなたは(これも事前に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からNまでのループ(Nrows*colsとなります)

+0

:PIは私も彼らにすべきだと思う... – UmNyobe