【问题标题】:why does rand() in this code always produce the same matrix [duplicate]为什么这段代码中的 rand() 总是产生相同的矩阵[重复]
【发布时间】:2015-06-18 03:40:52
【问题描述】:

我想创建一个矩阵,它的所有元素都是 1 或 0。这就是我尝试过的方法,它会根据我的需要在随机位置生成一个 1 和 0 的矩阵。但是,它每次都会产生相同的矩阵。

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

int a[10][10];
int i = 0,j= 0,n=0;

int main(void)
{
 populate(5);
 print(5);

 return 0;
}

int populate(int n)
{
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   a[i][j] = rand()%2;
  }
 }
}

int print(int n)
{
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   printf("%d ",a[i][j]);
  }
  printf("\n");
 }
}

编辑:根据回复,我编辑了我的函数,如下所示。但是我看到我的矩阵现在全为零或全一。

int populate(int n)
{
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   srand (time(NULL));
   a[i][j] = rand()%2;
  }
 }
}

【问题讨论】:

  • “任何相信算法可以产生随机性的人都存在于数学上的罪恶状态。”或者至少,疼痛。看到这个:stackoverflow.com/questions/1108780/…你需要重新播种rand
  • 如果您以这种方式编辑函数,则不是根据回复进行的。例如,您似乎完全错过了这一点,“对于在调用 srand 中使用的每个不同的种子值,可以预期伪随机数生成器在随后调用 rand 时生成不同的连续结果。”和这个“添加 srand(time(NULL)); 在 main 的开头。”

标签: c matrix random


【解决方案1】:

但是,它每次都会产生相同的矩阵。

那是因为您还没有添加代码来播种随机数生成器。添加

srand(time(NULL));

在main 的开头,在对rand() 进行任何调用之前。

【讨论】:

    【解决方案2】:

    您需要添加srand ( time(NULL) );

    伪随机数生成器使用作为种子传递的参数进行初始化。

    对于在调用srand 时使用的每个不同的种子值,可以预期伪随机数生成器在随后对rand 的调用中生成不同的连续结果。

    具有相同种子的两个不同初始化将在随后对 rand 的调用中生成相同的连续结果。

    如果种子设置为 1,则生成器将重新初始化为其初始值,并生成与调用 rand 或 srand 之前相同的值。

    这是一个如何播种 srand 的示例:

    /* srand example */
    #include <stdio.h>      /* printf, NULL */
    #include <stdlib.h>     /* srand, rand */
    #include <time.h>       /* time */
    
    int main ()
    {
      printf ("First number: %d\n", rand()%100);
      srand (time(NULL));
      printf ("Random number: %d\n", rand()%100);
      srand (1);
      printf ("Again the first number: %d\n", rand()%100);
    
      return 0;
    }
    

    编辑: 当 OP 编辑​​问题时,解决方案如下: 在方法的最开头使用srand(time(NULL));。

    int populate(int n) {
        srand(time(NULL));
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                a[i][j] = rand() % 2;
            }
        }
        return 0;
    }
    

    【讨论】:

    • 请通过说明添加此代码的何处来扩展您的答案。有很多错误的地方可以添加它。
    • @rakeb.void,谢谢 rakeb。请看我上面的编辑。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多