【问题标题】:Finding average of random numbers from 1 to 50 in c++ [closed]在c ++中找到1到50的随机数的平均值[关闭]
【发布时间】:2020-02-26 20:20:30
【问题描述】:

我需要找到 50 个随机数(从 1 到 10),然后找到平均值,我知道如何找到随机数,但我无法找到平均值,这就是我目前所拥有的......

srand(time(0));
for (int i = 1; i < 51; i++) {
    cout << 1 +(rand()%10) << endl;
}

【问题讨论】:

  • 你知道如何计算它们的总和吗?
  • @churill 积累数字就够了,不需要全部存储。
  • 不要使用rand。这些天我们有much better tools。另请参阅rand() Considered Harmful
  • @churill 不确定这是否是您的意思,但运行平均值的数值稳定性较差,在没有舍入错误的情况下,您会得到相同的结果。这与近似值不完全相同
  • 请先计算一下。在不知道应该做什么的情况下编写代码是可能的,但不必要地困难。你知道如何用纸笔计算平均值吗?

标签: c++ c++14


【解决方案1】:

首先让我们定义计算平均值的公式。将您生成的所有随机数相加,然后除以生成的数字数,在您的情况下为 50。让我们使用n 作为要生成的随机数的个数:

#include <iostream>

int main()
{
  const int n = 50;
  int sum = 0;

  for (int i = 0; i < n; i++)
  {
      int number = 1 + (rand() % 10);
      std::cout << number << std::endl;
      sum += number;
  }

  double avg = static_cast<double>(sum) / n;
  std::cout << avg << std::endl;
}

现在解决随机数生成问题。有比使用rand() 更好的方法来生成随机数。这是在lowhigh 之间生成随机数的简单方法:

#include <random>
#include <iostream>

int main()
{
  // random number generator
  const int low = 1;
  const int high = 10;
  std::random_device rd;
  std::mt19937 mt(rd());
  std::uniform_int_distribution<> dist(low, high);

  const int n = 50;
  int sum = 0;

  for (int i = 0; i < n; i++)
  {
      int number = dist(mt);
      std::cout << number << std::endl;
      sum += number;
  }

  double avg = static_cast<double>(sum) / n;
  std::cout << avg << std::endl;
}

【讨论】:

  • 是的,我在将sum 设为双倍和static_casting 之间摇摆不定。你说哪个更好?
  • 我想我更喜欢最终计算中的演员表。它比在循环中进行一堆浮点加法更简单。如果 int 太小而无法容纳总和,我可能会改变主意。
【解决方案2】:

声明一个变量sum并不断添加生成的随机数,最后除以50:

int sum = 0;
for (int i = 1; i < 51; i++) {
    int number = 1 + (rand() % 10);
    cout << number << endl;
    sum += number;
}
double avg = sum / 50.0;
cout << avg << endl;

【讨论】:

  • 正常循环将是 0 到小于 N。
【解决方案3】:

您可以尝试使用现代 C++ 功能来生成随机数。首先,std::random_device 仅用于为随机数生成器播种一次,在以下情况下为std::mersenne_twister_engine。它是一个基于 Mersenne Twister 算法的随机数引擎,它产生无符号整数。然后,std::uniform_int_distribution 使用前面提到的生成器生成随机整数值,该值均匀分布在闭区间 [1, 10] 上。

完整代码:

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 eng(rd());
    std::uniform_int_distribution<> distr(1, 10);

    int sum = 0;
    for (int i = 0; i < 50; ++i) {
        sum += distr(eng);
    }

    double avg = sum / 50.0;
    std::cout << avg << std::endl;

    return 0;
}

Demo

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多