【问题标题】:rand() not produce random [c]rand() 不产生随机 [c]
【发布时间】:2013-09-12 18:02:20
【问题描述】:

我被要求编写一个生成 2d 随机数数组的程序。我的代码产生了奇怪的结果。不管矩阵的大小如何,它都会产生一个“反向对角矩阵”(不知道还能叫什么)。我要理解 rand() 会产生一个介于 0 和 RAND_MAX 之间的伪随机数,但不知何故,结果取决于我的矩阵的大小,我不确定这种行为是如何发生的。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAT_SIZE 5

void main (void)
{

srand(time(0));

unsigned char * ptr = malloc(MAT_SIZE*MAT_SIZE);
unsigned char i, j;

for(i = 0; i < MAT_SIZE; i++)
{
    for(j = 0; j < MAT_SIZE ; j ++)
    {

        *(ptr + i + j ) = rand();
    }
}
 for(i = 0; i < MAT_SIZE ; i++)
{
    for(j = 0; j < MAT_SIZE ; j ++)
    {
        printf("%5d", *(ptr + i + j));
    }
    printf("\n");
}
    free(ptr);
}

3*3 的输出

142  141   11
141   11  230
11   230   28

5*5 的输出

232  157   62  131  245
157   62  131  245   54
 62  131  245   54  138
131  245   54  138  246
245   54  138  246  108

即使是伪随机数也不应该因使用方式而异。我对导致这些结果的程序有什么不明白的地方吗?

【问题讨论】:

  • 如果您不分配内存块并尝试将矩阵映射到其中,而是直接声明并使用矩阵,您的代码会简单得多:即int matrix[MAT_SIZE][MAT_SIZE];
  • *(ptr + i + j) ==> *(p[i]+j)
  • 不,gangadhar,这是一个段错误。 p[i] 是一个字符,而不是一个指针。
  • @Ferruccio,您应该将其详细说明为答案。不幸的是,仍然有很多代码向初学者出售这种二维数组的“仿真”,而不是从一开始就教他们正确的东西。

标签: c random


【解决方案1】:

问题不在于生成的随机数,而在于您如何将它们保存在矩阵中。访问你不想要的元素(j, i)

*(ptr + i + j )

但是

*(ptr + MAT_SIZE * i + j )

【讨论】:

    【解决方案2】:

    您只访问数组的第一个 i+j 成员,并重复循环遍历相同的索引。而不是:

    *(ptr + i + j )

    试试

    *(ptr + i * MAT_SIZE + j )

    【讨论】:

      【解决方案3】:

      请注意,您可以按如下方式动态分配二维数组:

      unsigned char (*ptr)[MAT_SIZE] = malloc( MAT_SIZE * sizeof *ptr );
      ...
      ptr[i][j] = rand();
      ...
      free( ptr );
      

      让生活更简单。这样您就可以使用普通的二维数组索引,而不必将ij 映射到单个维度。

      尼特:

      除非您的编译器文档明确void main() 列为main 的有效签名,否则请改用int main( void )。我知道您已经在书籍和在线上看到了数千个void main() 的示例,但仅仅因为编译器没有抱怨它并不意味着它没有错。

      rand() 返回int,它不适合unsigned char。无符号类型的溢出是明确定义的,但即便如此,您可能希望将 rand 结果显式映射到范围 [0..255]。

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多