使用 rand() 的多维数组

发布于 2024-11-06 01:41:30 字数 565 浏览 2 评论 0原文

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

I want to create a multidimensional array with just two values : 0 or 1.

I use the srand/rand functions but array contains only 0.
Here is the code :

#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 ;
    }
}

I don't know how to solve this problem ?

thanks !

Edit : Thanks for your answers. Do you think it's possible with rand() to have juste one "1" per column and others spots contain only 0 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

孤君无依 2024-11-13 01:41:30

你的循环并没有按照你的想法去做。试试这个:

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。

Your loop doesn't do what you think it does. Try this:

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;
        }
    }  
}

At the end of that, you will have an array where each spot randomly has a 1 or a 0.

小嗷兮 2024-11-13 01:41:30

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

您应该在生成的随机数上采用 %2 。给出该提示后,尝试使程序更加简单且易于理解。为什么不按顺序填充数组的每个元素?

I want to create a multidimensional array with just two values : 0 or 1

You should take the % with 2 on a random number generated. With that hint given, try to make the program more simpler and easy to understand. Why don't you just fill each element of the array sequentially ?

等你爱我 2024-11-13 01:41:30

编辑的问题

您认为 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()生成()函数。每次程序调用时 srand() 的调用次数不得超过一次(以保证最大的随机性)。实现此目的的最佳方法是从 main() 调用 srand
另外,我将变量命名为 rowcol,而不是 ij
而且,我将 tab 设为局部变量而不是全局变量。 尽可能避免全局变量:这是你帮自己的忙。如果没有全局变量,信息将通过参数传递给函数。

Edited question

Do you think it's possible with rand() to have just one "1" per column and others spots contain only 0?

Yes, of course.

Instead of looping over all lines and all columns setting each individual array element to a random value of 0 or 1 do initialize all array elements to 0 (if they aren't already); loop over all columns and choose 1 random line and set the corresponding array element to 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);
    /* ... */
}

Notice I've removed the srand() from the generate() function. srand() should be called no more than once per program invocation (to guarantee maximum randomness). The best way to accomplish that is to call srand from main().
Also, instead of i and j, I named the variables row and col.
And, I've made tab a local variable rather than global. Avoid globals whenever possible: it's a favor you do yourself. With no globals the information is passed to the function through arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文