【问题标题】:Biggest random number in 1-20 range1-20 范围内的最大随机数
【发布时间】:2013-11-13 14:28:58
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int n, i;

    srand(time(NULL));

    for(i = 1; i <= 19; i++)
        printf("%d \n", rand() * 21 / RAND_MAX);

    return 0;
}

代码有效。有点。它在控制台 20 中显示 1-20 之间的“随机”数字。比如 1 19 6 8 18 6 8 等。有些数字或多或少地重复。

我需要的是显示最大的数字。我是菜鸟,所以保持简单。谢谢。

【问题讨论】:

    标签: c random numbers


    【解决方案1】:

    那又怎样:

    int biggest = 0;
    
    for(i = 1;i < 20; i++){
       int num = rand() * 21 / RAND_MAX;
    
       if (num > biggest){
          biggest = num;
       }
    
       printf("%d \n", num);
    }
    
    printf("Biggest: %d \n", biggest);
    

    【讨论】:

    • 一直显示相同的字符串编号。很奇怪。
    • 为什么会令人惊讶?如果您从 1 到 20 中选择 20 个随机数,很有可能(大约 64%)其中一个是 20。每次发生这种情况时,它都会被选为最大的。
    • 一个小调整:要获得 1 到 20 之间的数字,您需要 num = 1 + rand() * 20 / RAND_MAX;
    【解决方案2】:

    试试这个

    int biggest = 0, num;
    
    
    for(i=0; i < 20; i++)
    {   
        num = 1 + rand()%20; 
        if (biggest < num)
            biggest = num;  
    }       
    printf("%d \n", biggest);
    

    【讨论】:

      【解决方案3】:

      信不信由你,您可以使用单个随机数进行这样的订单统计。如果k是随机值的个数,每个都在1..max_value的范围内,那么:

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      #include <math.h>
      
      int main(void)
      {
          int seed;
          /*
           * Grab a seed value from /dev/random to avoid time dependency
           * artifacts in the first generated rand() value when running
           * this multiple times in quick succession.
           */
          FILE *fp = fopen("/dev/random", "r");
          fread((char*)(&seed),sizeof(seed),1,fp);
          fclose(fp);
      
          srand(seed);
          int k = 20;
          int max_value = 20;
      
          /* 
           * The k'th root of a single uniform has the same distribution as
           * the max of k uniforms. Then use inversion to convert to desired
           * output range.
           */
          int num = 1 + max_value * exp( log( ((double)rand()) / RAND_MAX ) / k );
          printf("%d is the max of %d samples in the range 1..%d\n", num, k, max_value);
          return 0;
      }
      

      与 1..20 范围内的最大 20 个随机数具有相同的分布,无需循环!取决于k 的大小以及您的rand() 函数的昂贵程度,这确实可以获得回报。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 2010-11-26
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2011-12-16
        相关资源
        最近更新 更多