带rand()的多维数组

时间:2011-05-09 22:21:23

标签: c random multidimensional-array srand

我想创建一个只有两个值的多维数组: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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

  

我想创建一个只有两个值的多维数组:0或1

您应该在生成的随机数上使用 2 %。有了这个提示,试着让程序更简单易懂。为什么不直接填充数组的每个元素顺序

答案 2 :(得分:0)

编辑问题

  

您是否认为rand()每列只有一个“1”而其他点只包含0?

是的,当然。

不是循环遍历所有行和所有列,而是将每个单独的数组元素设置为随机值01,而是将所有数组元素初始化为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() 另外,我将变量ij命名为rowcol,而不是tab和{{1}}。 并且,我已将{{1}}设为局部变量而非全局变量。 尽可能避免使用全局变量:这对你自己有利。没有全局变量,信息将通过参数传递给函数。