srand(time(0))和rand()导致堆栈溢出错误

问题描述 投票:0回答:2

我正在为一个项目工作,我必须实现不同的排序算法。其中一个是随机快速排序,但我的随机数总是设置为-800百万,即使在设置了srand并设置了一个数字范围来挑选,导致堆栈溢出错误。

我已经尝试了所有我能想到的东西,这并不多。我尝试在另一个.cpp文件中创建一个随机数生成器,它工作正常,它只是因为某些原因在这种情况下不起作用。我只是不明白它是如何不正确生成随机数的。

void randomizedQuickSort(int arr3[], int start, int end) {
    int temp, pivot;
    int s = start, e = end;
    srand(time(0)); //<------------------------ ERROR THROWN

    // Partitioning
    while (s <= e) {
        pivot = 0 + (rand() % 5);
        while (arr3[s] < pivot)
            s++;
        while (arr3[e] > pivot)
            e--;
        if (s <= e) {
            temp = arr3[s];
            arr3[s] = arr3[e];
            arr3[e] = temp;
            s++;
            e--;
        }

        // Recursion
        if (start < e)
            randomizedQuickSort(arr3, start, e);
        if (s < end)
            randomizedQuickSort(arr3, s, end);
    }
}

我希望数字在0到4之间,但每次都会产生-858,993,460。这是错误和变量值的屏幕截图:

https://i.gyazo.com/47a0becfd5d26ae0a15c08af285c4357.png (点击图片放大)

c++ visual-studio sorting random
2个回答
1
投票

你遇到的最可能的问题是太深的递归调用,它会溢出堆栈。此外,您在每次递归调用中都不需要srand()srand()只是初始化随机数生成器,它通常只执行一次,但不是在每个循环步骤中。把它放在randomizedQuickSort()之外。只需在程序开头调用srand(time(0));(如果你在单独的线程中执行它,则调用当前线程)。

您在“Watch / Autos”Visual Studio窗口中对pivot有负值,因为它在堆栈溢出时尚未初始化,从而中断程序执行。

另外(正如斯特凡回答的那样)你可以在这里溢出阵列边界

while (arr3[s] < pivot)
    s++;
while (arr3[e] > pivot)
    e--; 

检查se是否在startend的范围内:

while (arr3[s] < pivot && s < end - 1)
    s++;
while (arr3[e] > pivot && e > start)
    e--; 

或者在pivotstart之间为end指定一个随机数组元素的值,而不是在某个范围内的随机值。

如果您仍然会有堆栈溢出,请使算法迭代或在您排序的数据数组中放入更少的元素。


2
投票

还有一件事:

这个:

pivot = 0 + (rand() % 5);
while (arr3[s] < pivot)
    s++;

对于:

int arr3[] = { 1212, 1341, 61255, 1325, 125 };

使s超出范围,即:s将比实际的数组长度更大。

这可能会导致意外行为。

© www.soinside.com 2019 - 2024. All rights reserved.