rand()不产生随机[E]

时间:2013-09-12 18:02:20

标签: c random

我被要求编写一个程序,生成一个随机数的二维数组。我的代码产生奇怪的结果。无论矩阵的大小如何,它都会产生“反向对角矩阵”(不知道还有什么可以称之为)。我要理解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

即使伪随机数也不应根据其使用方式而有所不同。是否有一些我不了解强制这些结果的程序?

3 个答案:

答案 0 :(得分:8)

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

*(ptr + i + j )

*(ptr + MAT_SIZE * i + j )

答案 1 :(得分:2)

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

*(ptr + i + j )

尝试

*(ptr + i * MAT_SIZE + j )

答案 2 :(得分:0)

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

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

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

尼特:

除非您的编译器文档明确void main()列为main的有效签名,否则请改用int main( void )。我知道你已经在书中和网上看到了成千上万的{{​​1}}例子,但仅仅因为编译器没有抱怨它并不意味着没有错。

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