Многомерный массив с rand()
Я хочу создать многомерный массив с двумя значениями: 0 или 1.
Я использую функции srand/rand, но массив содержит только 0. Вот код:
#define NB_LINE 4
#define NB_COLUMN 11
int tab[NB_LINE][NB_COLUMN] ; // global variable
void generate() {
srand((unsigned int)time(NULL));
int n, i, j;
for(n = 0; n < NB_LINE*NB_COLUMN; ++n){
do
{
i = rand() % NB_LINE;
j = rand() % NB_COLUMN;
}
while (tab[i][j] != 0);
tab[i][j] = 1 ;
}
}
Я не знаю, как решить эту проблему?
Спасибо!
Изменить: Спасибо за ваши ответы. Считаете ли вы, что с помощью rand() можно использовать только одну "1" на столбец, а в других местах есть только 0?
3 ответа
Отредактированный вопрос
Как вы думаете, возможно ли с помощью rand() иметь только одну "1" на столбец, а в других местах есть только 0?
Да, конечно.
Вместо зацикливания всех строк и всех столбцов для каждого отдельного элемента массива устанавливается случайное значение 0
или же 1
инициализируйте все элементы массива в 0 (если они еще не сделаны); цикл по всем столбцам и выберите 1 случайную строку и установите соответствующий элемент массива в 1
,
#include <stdlib.h>
#include <string.h> // memset
#include <time.h>
void generate(int *arr, size_t lines, size_t columns) {
int col, row;
memset(tab, 0, lines * columns * sizeof *arr);
for (col = 0; col < columns; col++) {
row = rand() % lines;
tab[row * columns + col] = 1;
}
}
int main(void) {
int tab[NB_LINE][NB_COLUMN];
srand(time(0)); /* no casts */
generate(&tab[0][0], NB_LINE, NB_COLUMN);
/* ... */
}
Обратите внимание, что я удалил srand()
от generate()
функция. srand()
должен вызываться не более одного раза за вызов программы (чтобы гарантировать максимальную случайность). Лучший способ добиться этого - позвонить srand
от main()
,
Кроме того, вместо i
а также j
Я назвал переменные row
а также col
,
И я сделал tab
локальная переменная, а не глобальная. По возможности избегайте глобалов: вы делаете это сами. Без глобальных переменных информация передается функции через аргументы.
Ваш цикл не делает то, что вы думаете, что он делает. Попробуй это:
int tab[NB_LINE][NB_COLUMN] ; // global variable
void generate() {
srand((unsigned int)time(NULL));
int i, j;
for (i=0; i < NB_LINE; ++i) {
for (j=0; j < NB_COLUMN; j++) {
tab[i][j] = rand() % 2;
}
}
}
В конце этого у вас будет массив, где каждое пятно случайным образом имеет 1 или 0.
Я хочу создать многомерный массив с двумя значениями: 0 или 1
Вы должны взять %
с 2 на случайное число сгенерировано. С этой подсказкой постарайтесь сделать программу более простой и понятной. Почему бы вам просто не заполнить каждый элемент массива последовательно?