2012-05-04 4 views
2

Используя эту программу, я пытаюсь установить массив 6x15 равным 0, а затем помещать случайное число x в разы в случайном слоте массива , Однако, это не так, как планировалось ...Попытка сгенерировать определенное количество случайно размещенных чисел в массиве

Обратите внимание, что MAX_ROWS 6, MAX_COLS 15, и океанскую 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

Вы пересаживаете свой случайный генератор на каждый звонок, который сделает его не случайным. Удалить эту линию:

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; 
} 
+0

Зачем ему нужны числа в '1 <= x <= param', когда он использует их для индексации в массив? – mah

+0

@mah: Извините, исправлено. –

+0

Мне действительно нужно сделать это дальше, поэтому я смотрю на это. Благодаря! – Chunmeista

3

Каждый раз, когда вы звоните rand_number, вы сбрасываете псевдо ГСЧ srand((unsigned int)time(NULL));, удалите эту строку, или переместить его в начале вашего основного()

Не называйте srand() больше, чем один раз в программе, где-то при запуске программы.

В зависимости от того, что вы хотите сделать, помните, что генератор случайных чисел не создает уникальные номера, поэтому вам может понадобиться учитывать это, если вы хотите гарантировать, что вы разместили shipnum записей в своем массиве. То есть ваши 6 звонков на rand_number() могут все произвести 4.

+0

Спасибо, это сработало! – Chunmeista

0

В дополнение к тому, что вы не вызываете srand() несколько раз, вы не получите желаемый результат с циклом while, который у вас есть. Вы заявляете, что хотите всего 6 кораблей, 1, 1, 1, 2, 2, 3, однако ваш цикл while помещает один из каждого типа, после чего ваш shipnum будет == 0, вырвав вас из цикла ,

Вместо этого создайте три отдельные процедуры размещения судов, по одному для каждого типа. Кроме того, вам нужно убедиться, что ваше место размещения не находится поверх другого корабля - это именно то, что происходит, когда вы выполняете srand() в своей случайной функции при вызове так быстро, и это может произойти и в другое время.

0

Первое, что меня поразило, это то, что вы не проверяете, имеет ли уже существующая ячейка судно, назначенное или нет. Я бы использовал 0 в качестве контрольной суммы.

Также (прошло некоторое время с тех пор, как я работал со случайными числами), я уверен, что с вашим семенем что-то не так.Я считаю, что компьютер слишком быстро подходит для вашей функции, что означает, что «время», которое вы используете в качестве семени, всегда одно и то же.

Сделать семя внешним (объявить его вне тела функции) и инициализировать его один раз.