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;
}
4

4 に答える 4

3

を呼び出すたびrand_numberに、疑似 rng を でリセットする srand((unsigned int)time(NULL));か、その行を削除するか、main() の先頭に移動します。

プログラムの起動時にどこかで、プログラム内でsrand() を複数回呼び出さないでください。

やりたいことによっては、乱数ジェネレーターは一意の数値を生成しないことに注意してください。そのためshipnum、配列にエントリを確実に配置したい場合は、そのことを考慮する必要がある場合があります。つまり、rand_number() への 6 回の呼び出しはすべて 4 を生成する可能性があります。

于 2012-05-04T11:02:08.763 に答える
2

すべての呼び出しでランダムジェネレーターを再シードしているため、ランダムではなくなります。次の行を削除します。

srand((unsigned int)time(NULL));

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

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;
}
于 2012-05-04T11:01:46.243 に答える
0

最初に私を驚かせるのは、既存のセルにすでに船が割り当てられているかどうかをチェックしないことです。番兵の値として0を使用します。

また(私が乱数を使って作業してからしばらく経ちました)、あなたのシードに何か問題があるに違いありません。コンピューターが速すぎて関数を成功させることができないと思います。つまり、シードとして使用する「時間」は常に同じです。

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

于 2012-05-04T11:10:29.563 に答える
0

srand() を複数回呼び出さないことに加えて、while ループでは目的の出力が得られません。合計 6 つの船、1、1、1、2、2、3 が必要であると述べていますが、while ループは各タイプの 1 つを配置し、その後shipnum== 0 になり、ループから抜け出します。

代わりに、タイプごとに 1 つずつ、3 つの別個の船配置ルーチンを作成します。さらに、配置が別の船の上にないことを確認する必要があります。これは、ランダム関数内で srand() を非常に迅速に呼び出したときに発生していることとまったく同じであり、他の場合にも発生する可能性があります。

于 2012-05-04T11:08:37.983 に答える