繁体   English   中英

在随机生成的数组中,最小数始终为 0

[英]In randomly generated array minimum number is always 0

我想知道为什么最小数字总是“0”。

我用随机数生成数组,然后我做了一些操作。 除了最小数量外,一切正常。

这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        var array = new int[10];
        var number1 = 1;
        var number2 = 100;
        var min = array[0];
        var max = array[0];
        var sum = 0;
        var average = 0;

        Random randomNum = new Random();
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = randomNum.Next(number1, number2);

            Console.WriteLine(array[i].ToString());

            if(array[i] > max)
            {
                max = array[i];
            }
            else if (array[i] < min)
            {
                min = array[i];
            }

            sum += array[i];
            average = sum / array.Length;

        }
        Console.WriteLine($"\nmin = {min}, max = {max}, sum = {sum} and average = {average}");

    }
}

因为您在填充数组之前使用array[0]初始化了min变量。

初始化数组会将其所有项目初始化为其默认值(有关更多详细信息,请阅读Why doesn't a struct in an array have to be initialized? ),并且int的默认值为0 ,并且您的数组仅包含数字大于0 ,你的min永远不会改变。

将其初始化为number2int.MaxValue ,您将获得实际的最小值。

在 min 赋值行上放一个断点: min 总是 0 因为你没有传递它......

因为array[i] < min总是假的,因为min0开始并且array[i]总是更高。

要在不重写算法的情况下解决问题,您可以将 min 设置为:

min = int.MaxValue;

由于max0开始,它适用于它,但你应该写:

max = 0;

即使array[0]默认初始化为0

由于以下原因,您的min将始终为零:

else if (array[i] < min)
{
     min = array[i];
}

您正在将min初始化为零。 当您从Random.next中获取一个数字时,它将给出 [1,100) 因此 min 将始终小于randomNumber 因此,您的最小值永远不会改变。

相反,您可以这样做:

min = int.MaxValue;

在 for 循环之前。

我做了一些更完整的返工,然后只是那些提示。

var array = new int[10];
//telling names are very importan
var lowerBound = 1;
var upperBound = 100;
//This is a reliable initialisation
var min = upperBound;
var max = lowerBound;
var sum = 0;

Random randomNum = new Random();
for (int i = 0; i < array.Length; i++)
{
    //adding a temporary variable makes it cleaner and requires less accessor use
    int temp = randomNum.Next(number1, number2);

    Console.WriteLine(temp.ToString());

    //No else-if. The first number has a 98% chance to check both of those.
    if(temp > max)
    {
        max = temp;
    }
    if (temp < min)
    {
        min = temp;
    }

    sum += temp;
    arraiy[i] = temp;

}

//No point calculating that before the output.
int average = sum / array.Length;
Console.WriteLine($"\nmin = {min}, max = {max}, sum = {sum} and average = {average}");

请注意,我做了大部分工作是为了便于阅读。 性能方面应该没有区别。 JiT 编译器非常擅长削减未充分使用的临时变量或添加临时变量以避免过多的索引器访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM