【问题标题】:Max output is incorrect最大输出不正确
【发布时间】:2014-04-01 03:12:24
【问题描述】:

试图计算数组中随机数的最大值和最小值,我不确定我在这里做错了什么。我一直在试图弄清楚,但我束手无策。也许你们中的一个可以帮忙?

#include <iostream>
#include <stdlib.h>   
#include <ctime>

using namespace std;

int main() {
    int *sora;
    int num;
    int min;
    int max;

    cout<< "Enter the size :  " ;
    cin >> num;
    cout<< endl;
    sora = new int [num];   

    max= sora[0];
    min= sora[0];

    srand((unsigned)time(0));

    for(int x=0;x<num; x++) {
        sora[x]=rand()%100;

        if(min > sora[x]) {
            min=sora[x];        
        }
        else if (max < sora[x]) {
            max=sora[x];
        }

        cout<< sora[x] << endl;     
    }

    cout<< "Maximum value is: " << max << endl << "Minimum value is: " << min;
}

【问题讨论】:

  • 我很惊讶我不能立即为这个问题找到一个好的副本。
  • 我知道对吗?看起来很简单,就像其他人会犯这个错误一样,但没有多少人犯过。

标签: c++ random max min


【解决方案1】:
if(min > sora[x]) {
    min=sora[x];
}
else if (max < sora[x])
{
    max=sora[x];
}

有问题。仅当满足第一个 if 时,才输入第二个 else if 语句。但是第二个if 必须始终执行。请把上面的块改成如下

if(min > sora[x]) {
    min = sora[x];
}
if (max < sora[x]) {
    max = sora[x];
}

而且您还使用未初始化的区域进行比较。如果您只使用正数

max = 0;
min = UINT_MAX;

如果你也使用负数,那么

max = INT_MIN;
min = INT_MAX;

您必须为这些宏添加&lt;limits.h&gt;

【讨论】:

  • 我仍然得到错误,最小值是正确的,但最大值被吹得不成比例了。
  • 这是我刚刚得到的结果。最大值为:2952960 最小值为:25 实际最大值为96
  • 你是否正确初始化了最小值和最大值>
【解决方案2】:

当您执行max= sora[0];min= sora[0]; 时,您将最小值和最大值初始化为一个未定义的值

另外,你有一个else,你不一定想要一个。第一个值将是最小值 最大值。 您可以从设置max=0min=99 开始,这应该可以解决该特定问题。

【讨论】:

  • 您指出else 问题是对的(在看到未定义的行为后我没有注意到),但是如果适当地设置minmax 不会解决它第一个生成的值恰好是(唯一的)最大值。
【解决方案3】:
sora = new int [num];   

max= sora[0];
min= sora[0];

这一行用垃圾初始化一个 int 数组,并将 max 和 min 设置为垃圾值。

你有两个选择:

  1. 在开始时将 max 初始化为可能的最小值 (INT_MIN),并将 min 初始化为可能的最大值 (INT_MAX)。

  2. 首先创建一个随机值并将其分配到 sora[0] 并将 max 和 min 初始化为该值。之后初始化 [1..num]

【讨论】:

    【解决方案4】:

    您正在读取一个未初始化的内存位置:

    sora = new int [num];   
    
    max= sora[0];
    min= sora[0];
    

    使用new 创建数组不会初始化其内容。

    这会导致所谓的未定义行为,这意味着几乎任何事情都可能发生。在这种情况下,它可能很普通:一些任意值(很可能在 rand()%100 的 0-99 范围之外)存储在 min 和 max 中,经常导致不正确的结果。

    相反,做

    // must #include <limits>
    
    int max = std::numeric_limits<int>::min();
    int min = std::numeric_limits<int>::max();
    

    甚至只是

    int max = 0;
    int min = 99;
    

    因为您的范围是预定义的。

    【讨论】:

    • @AlanWatts 另请注意 Daniel 和 Sakthi Kumar 指出的问题
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2021-08-10
    • 2021-03-05
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多