【问题标题】:Multidimensional array with rand()带有 rand() 的多维数组
【发布时间】:2011-05-09 22:21:22
【问题描述】:

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

【问题讨论】:

  • 澄清一下:您希望阵列中的每个点随机有 1 或 0?
  • 您应该标记您正在使用的语言。我会猜 c++,但如果你标记语言,你更有可能得到答案
  • 我想生成一个数组,其中每个点包含 0 或 1。
  • “column”用“u”拼写。这不仅仅是迂腐。糟糕的拼写使代码更难阅读,可能导致错误,并导致其结果非常不幸(例如,臭名昭著的 HTTP“referer”字段)。
  • "but array contains only 0" -- 不,您的代码用 1 填充数组 -- 您搜索 44 次,查找 0,然后将其更改为 1。您可以使用通过循环直到n &lt; NB_LINE*NB_COLOMN/2,半 0 半 1,但这样做的速度很慢。

标签: c random multidimensional-array srand


【解决方案1】:

您的循环并没有按照您的想法执行。试试这个:

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。

【讨论】:

  • 请删除未使用的变量 n 并修复错误的缩进(从 OP 复制)。
【解决方案2】:

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

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

【讨论】:

  • 感谢提示,我现在完全明白了,我的代码太复杂了。
【解决方案3】:

编辑问题

你认为 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);
    /* ... */
}

请注意,我已从 generate() 函数中删除了 srand()srand() 每次程序调用不应超过一次(以保证最大随机性)。最好的方法是从main() 调用srand
另外,我将变量命名为 rowcol,而不是 ij
而且,我将tab 设为局部变量而不是全局变量。 尽可能避免使用全局变量:这是您自己做的一件好事。在没有全局变量的情况下,信息通过参数传递给函数。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 2013-10-27
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多