在Java中,使用.nextInt()可以从random类中获得多少随机数?

在Java中,使用.nextInt()可以从random类中获得多少随机数?,java,random,pivot,quicksort,stack-overflow,Java,Random,Pivot,Quicksort,Stack Overflow,已解决:我在每个递归调用中实例化一个新的随机对象。我把它作为Quicksort中的一个静态变量,现在它工作得非常好 我正在用Java为学校作业编写Quicksort,但我被卡住了。我正在使用Random类中的nextInt()方法随机选择轴。这意味着我在每个递归步骤中调用nextInt()。 我的快速排序在包含20000个元素的数组中工作得非常完美。但是当我尝试对一个包含40000个元素的数组进行排序时,会出现这样的StackOverflowError java.lang.StackOve

已解决:我在每个递归调用中实例化一个新的随机对象。我把它作为Quicksort中的一个静态变量,现在它工作得非常好

我正在用Java为学校作业编写Quicksort,但我被卡住了。我正在使用
Random
类中的
nextInt()
方法随机选择轴。这意味着我在每个递归步骤中调用
nextInt()
。 我的快速排序在包含20000个元素的数组中工作得非常完美。但是当我尝试对一个包含40000个元素的数组进行排序时,会出现这样的
StackOverflowError

   java.lang.StackOverflowError: null (in java.util.Random)
我在谷歌上搜索了这个错误,没有任何帮助。我的猜测是,我的随机整数用完了,但我对java非常熟悉,甚至连我自己的猜测都不相信

这是我的代码(西班牙语是我的第一语言,很抱歉我的英语和西班牙语代码太蹩脚了)

publicstaticvoidquicksort(字符串[]A,int-min,int-max){//llamarord(A,0,n-1);
如果(最小值>=最大值){
返回;
}
Random rand=新的Random();
int pivote=分词(A、min、max、rand);
快速排序(A、min、pivote-1);
快速排序(A,枢轴+1,最大);
}
公共静态整型分词(字符串[]A,整型最小值,整型最大值,随机数){
int menores=min+1;
int-mayores=max;
int pivote=rand.nextInt(max-min+1)+min;
字符串pivotstr=A[pivote];
//德贾尔枢轴原理酒店
字符串aux=A[min];
A[min]=A[pivote];
A[枢轴]=辅助;

而(menoresStackOverflower)是递归运行太深时得到的结果

解决方案:将其转换为迭代版本。

您的程序正在生成太多级别的递归调用,堆栈内存不足。一种解决方案是在运行时按所述增加堆栈大小。另一种是按照lorenzo.marcon的建议,从递归转换为迭代

Java的默认随机数生成器是一个具有48位种子大小的线性同余生成器,因此它的周期长度应为2**48。这意味着您不会用完随机整数,而是在许多值之后重复序列


堆栈溢出问题的一个重要原因是,每次递归调用都会实例化一个新的随机对象。你不会每次想喝水时都挖一口新井,大多数人都会挖一口井,然后重新访问它以获得更多的水。类似地,推荐的做法是实例化一个静态随机对象并修改它除非你真的知道自己在做什么,否则不要使用它来获取更多的值-你几乎永远不会想要多个随机对象。

我想说的是,在实际发布StackOverflow上的任何内容之前,你可能应该阅读什么是“StackOverflow错误”真正的意思是…谢谢,我会看看我能做些什么。但问题是StackOverflowerError发生在java.lang.Random中,我不知道如何操作Random类来解决这个问题。另外,当我调用Quicksort时没有随机轴,但是使用数组的第一个元素,ir工作得很好。使用dif调用Quicksortferent pivot导致了一个完全不同的递归调用序列-你不能比较苹果和橙子。你是对的。谢谢:)现在我解决了我的问题。我实例化了变量Random rand=new Random()摆脱了快速排序,现在它在超过100000个元素的数组中运行得非常好!我敢打赌它运行得也更快,即使在已经运行过的情况下也是如此。不,它是一样的。此外,我使用了Heapsort(迭代)使用相同的数组时,我的快速排序速度慢了5倍……确实出了问题,或者我的计算机递归速度非常慢
public static void quicksort(String[] A, int min, int max){// llamar ord(A, 0, n-1);
    if(min >= max){
        return;
    }
    Random rand = new Random(); 
    int pivote = particionar(A, min, max, rand);
    quicksort(A, min, pivote-1);
    quicksort(A, pivote + 1, max);
    }

public static int particionar(String[] A, int min, int max, Random rand){    
    int menores = min + 1;
    int mayores = max;

    int pivote = rand.nextInt(max-min+1) + min;
    String pivotstr = A[pivote];
    //dejar pivote al principio
    String aux = A[min];
    A[min] = A[pivote];
    A[pivote] = aux;

    while(menores <= mayores){
        if(A[menores].compareTo(pivotstr) <= 0){
            menores++;
        }
        else{//intercambiar
            String aux2 = A[menores];
            A[menores] = A[mayores];
            A[mayores] = aux2;
            mayores--;
        }
    }
    //mover pivote donde corresponde
    String aux3 = A[min];
    A[min] = A[mayores];
    A[mayores] = aux3;

    return mayores;

}