Многомерный массив с 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 на случайное число сгенерировано. С этой подсказкой постарайтесь сделать программу более простой и понятной. Почему бы вам просто не заполнить каждый элемент массива последовательно?

Другие вопросы по тегам