【问题标题】:Random numbers in CC中的随机数
【发布时间】:2011-01-27 19:30:33
【问题描述】:
for(i = 0; i < n; i++){
        srand(time(NULL));
        printf("%d ", time(NULL));
        for(j = 0; j < (n-1); j++){
            a[i][j] = rand();
        }
    }

我尝试生成随机数,但它们是相同的...我尝试srand(i * time(NULL))。不管.. 我该怎么办?

数组声明:

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);

a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

【问题讨论】:

  • 您的第一个calloc 调用应该是sizeof(int *),但您似乎在一个简单指针和整数大小相同的主机上工作(大多数架构都是如此)。
  • 您基本上在给出答案后立即编辑了您的问题,以使这些答案不再与问题匹配并以这种方式无效的方式。请不要这样做。

标签: c random srand


【解决方案1】:

在循环外调用srand()。您每次迭代都在重新播种。

srand() 为随机数生成器提供种子,因此您可以根据输入获得不同的随机数序列。您的循环运行得非常快,因此对time(NULL) 的调用总是返回相同的值。每次迭代都将重置为相同的随机序列。作为一般规则,在您的程序中只调用一次srand()

【讨论】:

  • 同意,您(通常)不需要多次为随机数生成器播种。
  • @bta:确实,您不需要多次播种rand()。重新播种“适当的”随机数生成器,我的意思是任何用于安全的东西,是另一回事。
【解决方案2】:

不要每次循环都调用srand() - 只需事先调用一次。

【讨论】:

    【解决方案3】:

    常见问题解答13.1513.20 将会很有趣。我很想为这些问题创建一个新标签。

    【讨论】:

    • 也许创建一个名为“srand() 如何影响随机数生成器的状态?”的问题,并在每次出现另一个细微变化时将其标记为重复 ;-)
    • 是的,CW 版本。但是我们会复制所有的 comp.lang.*.faqs,不是吗?
    • 是的,但是 SO 将不可避免地包含无数重复的常见问题解答(根据 F 的定义),所以无论你做什么都会重复 comp.lang.*.faq。但是,除非问题被无情地标记为重复问题,否则即使它们稍微改变了主题,它们最终得到的信息也会比现有的常见问题解答少(假设常见问题解答很好地涵盖了它)。 CW 版本的常见问题解答(在 SO 上也是 F)可以这样标记,并链接到语言常见问题解答和任何其他相关资源,并且可以以最一般的方式表达问题,以确保他们抓住最多的骗子。什么的。
    • 有些事情,我也一直在想。将此讨论移至元?
    【解决方案4】:

    srand 是一个“播种”随机数生成器的函数。如果您不知道,计算机中的随机数并不是真正随机的。实际上,计算机只是有一个看似随机的数字列表,您使用srand 告诉它从该列表的哪里开始,每次调用rand() 返回列表中的下一项。

    您编写srand(time(NULL)) 的原因是让随机数在您每次运行程序时都不相同的某个时间点开始(除非程序同时启动)。

    所以你在这里做的是反复告诉程序在同一点重新启动随机数列表(因为每次循环的时间都是相同的)。将调用移到循环外的srand,您将得到正确的结果。

    【讨论】:

      【解决方案5】:
      srand(time(NULL)); 
      
      for(i = 0; i < n; i++){         
              printf("%d ", time(NULL)); 
              for(j = 0; j < (n-1); j++){ 
                  a[i,j] = rand(); 
              } 
          } 
      

      在循环外调用 srand。

      【讨论】:

        【解决方案6】:

        您需要在进入循环之前调用srand()srand() 用给定的种子初始化 radnom 数生成器,并为此种子生成唯一的随机数序列。

        您的循环执行速度非常快,因此每次调用 time(NULL) 都会产生相同的时间(以秒为单位) - 因此您在每次循环迭代时使用相同的种子初始化随机数生成器。

        【讨论】:

          【解决方案7】:
          srand(time(NULL));
          for(i = 0; i < n; i++){
              for(j = 0; j < (n-1); j++){
                  a[i,j] = rand();
              }
          }
          

          没关系。数量是一样的……

          【讨论】:

          • a[i,j] 语法是什么?你可能想要a[i][j],尽管你应该得到一个编译器错误,除非 j 是一个普通数组而不是像我确定你想要的那样的二维数组。
          【解决方案8】:
          int** a;
          int i;
          printf("Enter array size: ");
          scanf("%d", &n);
          if( n < 1 ){
              printf("Size should be > 0\n\n");
              return NULL;
          }
          a = (int**)calloc(n, sizeof(int));
          for(i = 0; i < n; i++)
              a[i] = (int*)calloc(n-1, sizeof(int));
          

          这是我的数组...

          【讨论】:

          • 首先,您应该编辑您的帖子以添加此新信息。这个网站不像论坛那样工作。其次,我坚持我的说法,即您的二维数组语法是错误的,您应该在访问项目时执行a[i][j]。下面是多维数组教程:functionx.com/cpp/Lesson12.htm
          【解决方案9】:

          Sergey,您没有收到a[i,j] 版本的错误消息,仅仅是因为这是一个完全有效的表达式。逗号运算符从左到右计算子表达式并返回最后一个表达式的值。因此,写a[i,j] 等同于a[j]。您在打印中收到的是指向矩阵中第 j 个向量的指针的值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-08
            • 2011-11-07
            • 1970-01-01
            • 1970-01-01
            • 2014-04-27
            • 2018-11-19
            • 1970-01-01
            相关资源
            最近更新 更多