2012-05-04 10 views
2

このプログラムを使用して、6x15配列を0に設定しようとしていて、配列のランダムスロットに乱数xを置きます。予定通りしかし、それは行かない... MAX_ROWSは6であるランダムに配置された数値を配列に生成する試み

注意、MAX_COLSは15で、OCEANこれは、ランダムな数字を配置する必要が0

#include <stdio.h> 
#include <time.h> 
#include "util.h" 

int rand_number(int param); 

main() 
{ 
int map[MAX_ROWS][MAX_COLS]; //initializes an array, map, with the dimensions 6 and 15. 

//sets all values in the array to 0 
int a,b; 

for (a = 0; a < MAX_ROWS; a++) 
{ 
for (b = 0; b < MAX_COLS; b++) 
{map[a][b]=OCEAN;} 
} 

int shipnum = 6; 

です。 (shipnumは私が置いて船の数を制限するために使用するだけの値である):

while(shipnum > 0) 
{ 
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 3; 
shipnum -= 1; 
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 2; 
shipnum -= 2; 
map[rand_number(MAX_ROWS)][rand_number(MAX_COLS)] = 1; 
shipnum -= 3; 
} 

しかし、私は

/*This will print the array*/ 
for (a = 0; a < MAX_ROWS; a++) 
{ 
for (b = 0; b < MAX_COLS; b++) 
{printf("%d ", map[a][b]);} 
printf("\n"); 
} 
} 

を実行したときに、私は

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

実際に私を与えています何かを取得したい

0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 2 0 0 0 0 0 3 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 

これは私が乱数を生成するために使用する関数です。

/*This will generate a random number*/ 
int rand_number(int param) 
{ 
srand((unsigned int)time(NULL)); 
int x = param; 
int rn = rand() % x; 
return rn; 
} 
+1

これは新しい戦艦映画のためですか? – nvuono

答えて

2

あなたは任意の呼び出しでランダムなジェネレータを再シードします。この行を削除してください:

​​

あなたのコードでは、すでに船があった場所に船を書くこともできます。これを許可しない場合は、そのセルに船を置く前にセルが空であることを確認する必要があります。

int x = rand_number(MAX_ROWS); 
int y = rand_number(MAX_COLS); 
if (map[x][y] == 0) { /* Add this check! */ 
    map[x][y] = 1; 
    shipnum -= 1; 
} 
+0

配列にインデックスを付けるときに '1 <= x <= param'に数字を入れたいのはなぜですか? – mah

+0

@mah:申し訳ありませんが、今修正されました。 –

+0

私は実際にこれを行う必要があるので、私はこれを見ています。ありがとう! – Chunmeista

3

あなたがrand_numberを呼び出すたび、あなたは(、srand((unsigned int)time(NULL));で擬似RNGをリセットし、その行を削除するか、あなたのメインの先頭に移動する)

(srand関数をコールしないでください)以上一度プログラム内でを実行すると、プログラム起動時にsomwhereになります。

あなたが何をしたいかによって、乱数ジェネレータは一意の数値を生成しないことを覚えておいてください。shipnumを配列に配置したことを保証する必要があるかもしれません。私。 rand_number()への6回の呼び出しはすべて4を生成する可能性があります。

+0

ありがとうございました! – Chunmeista

0

srand()を何度も呼び出さないことに加えて、whileループを使用して望みの出力を得ることはできません。あなたはあなたのwhileループが各タイプのうちの1つを配置してから、あなたのshipnumが== 0になり、ループからあなたを壊して、合計6つの船、1、1、2、2、3が欲しいと言っている。

代わりに、タイプごとに1つずつ、3つの別々の船舶配置ルーチンを作成します。さらに、あなたのプレースメントが他の船の上にないことを確認する必要があります。これは急速に呼び出されたときにランダム関数内でsrand()を実行したときに起きていることです。

0

私に打撃を与える最初のことは、既存のセルに既に船が割り当てられているかどうかを確認しないことです。私はセンチネル値として0を使用します。

また、私は乱数で作業していたため、しばらくしていましたが、あなたの種子に何か問題があると賭けています。私はコンピュータがあなたの関数が成功するには速すぎると信じています。つまり、あなたが種として使う「時間」は常に同じです。

シードを外部(関数本体の外で宣言)にして、一度初期化します。

関連する問題