C# 数组和 Random.NextDouble() 的奇怪行为

本文关键字:数组 Random NextDouble | 更新日期: 2023-09-27 18:33:57

我在main()方法中有以下代码:

    const int Length = 20;
    const int NumberOfExperiments = 100;
    static void Main(string[] args)
    {
        Random gen = new Random();
        double[][] arr = new double[NumberOfExperiments][];
        for (int j = 0; j < NumberOfExperiments; ++j)
        {
            arr[j] = new double[Length + 4];
            for (int i = 0; i < Length; ++i)
            {
                arr[j][i] = gen.NextDouble();
            }
            arr[j][Length] = bubbleSort(arr[j]);
            arr[j][Length + 1] = insertSort(arr[j]);
            arr[j][Length + 2] = arr[j][Length] - arr[j][Length + 1];
            arr[j][Length + 3] = arr[j][Length + 2] * arr[j][Length + 2];
            foreach(double memb in arr[j]){
                Console.WriteLine("{0}", memb);
            }
            Console.ReadKey();
        }
        WriteExcel(arr, "sorting");
        Console.ReadKey();
    }

在第一个 ReadKey() 之后,我有以下输出:


0
0
0 0 0.046667384
0.178001223
0.197902503
0.206131403
0.24464349
0.306212793
0.307806501
0.354127458
0.385836004
0.389128544
0.431109518
0.489858235
0.530548627
0.558604611
0.647516463
0.762527595
0.874646365
152 -151.1253536
22838.87251

我不知道为什么数组的前几个元素用 0 填充。第一次迭代总是以 i=0(或 j=0 )开头,所以没关系。函数bubbleSort()insertSort()正常工作并返回交换次数。我已经使用 C# 好几年了,但我真的不明白为什么这段代码不起作用。

C# 数组和 Random.NextDouble() 的奇怪行为

创建"行"时,执行以下操作:

arr[j] = new double[Length + 4];

但随后像这样循环:

for (int i = 0; i < Length; ++i)

因此,最后 4 个元素保留默认值 (0)。排序时,这些元素将转到开头。

看起来 bubbleSort() 获取一个数组并对其进行排序,在调用时,最后 4 个元素为空(设置为 0),因此它们转到结果的开头。检查 bubbleSort() 是否在某处使用 Array.Length,并确保它在那里减去 4。