Многомерный массив с rand () - PullRequest
0 голосов
/ 10 мая 2011

Я хочу создать многомерный массив с двумя значениями: 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 ]

4 голосов
/ 10 мая 2011

Ваш цикл не делает то, что вы думаете, что он делает. Попробуйте это:

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.

2 голосов
/ 10 мая 2011

Я хочу создать многомерный массив с двумя значениями: 0 или 1

Вы должны взять % с 2 на случайное число,С этой подсказкой постарайтесь сделать программу более простой и понятной.Почему бы вам просто не заполнить каждый элемент массива последовательно ?

0 голосов
/ 13 мая 2011

Отредактированный вопрос

Как вы думаете, возможно ли с помощью rand () иметь только одну "1" на столбец, а в других местах есть только 0?

Да, конечно.

Вместо зацикливания на всех строках и всех столбцах для каждого отдельного элемента массива устанавливается случайное значение 0 или 1 do Инициализируйте все элементы массива на 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 локальной переменной, а не глобальной. По возможности избегайте глобалов: это услуга, которую вы делаете сами. Без глобальных данных информация передается функции через аргументы.

...