0

0 または 1 の 2 つの値だけを持つ多次元配列を作成したいと考えています。

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」を1つだけ持つことができ、他のスポットには 0 しか含まれないと思いますか?

4

3 に答える 3

4

あなたのループは、あなたが思っていることをしません。これを試して:

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 を持つ配列が得られます。

于 2011-05-09T22:32:29.707 に答える
2

0 または 1 の 2 つの値だけを持つ多次元配列を作成したい

生成された乱数%2を取る必要があります。そのヒントをもとに、プログラムをより単純で理解しやすいものにしてください。配列の各要素を順番に埋めてみませんか?

于 2011-05-09T22:32:34.730 に答える
0

編集された質問

rand()を使用すると、列ごとに「1」を1つだけ持つことができ、他のスポットには0だけを含めることができると思いますか?

はい、もちろん。

すべての行とすべての列をループする代わりに、個々の配列要素をランダムな値に設定する0か、すべての配列要素を0に初期化1ます(まだ初期化されていない場合)。すべての列をループし、ランダムな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()プログラムの呼び出しごとに1回だけ呼び出す必要があります(最大のランダム性を保証するため)。それを達成するための最良の方法は、から呼び出すことsrandですmain()
また、との代わりに、変数とに名前を付けiました。 そして、グローバルではなくローカル変数を作成しました。可能な限りグローバルを避けてください。それはあなた自身が行うことの恩恵です。グローバルがない場合、情報は引数を介して関数に渡されます。jrowcol
tab

于 2011-05-13T08:31:12.050 に答える