lundi 5 juin 2017

Stackoverflow error while generating a set of 2 non repeated random numbers from a range of numbers

Below are the 2 methods which I am using to generate a random number from a range of numbers.This is part of a small maths quiz. The number of questions can go upto 50 questions. The only clause is the numbers should be non repeated i.e 5x6 if is present in the list I cant have 6x5 in the list.

The problem that I am facing is the below code throws stackoverflow error.I have tried to run it in a separate thread but I am unable to get it working.

The for loop used inside the first method is the one I use to check if the number is already present.

public QuestionsV1 generateQuestionsArray(int level, int range) {
generateRandomNumbers(level, range);
    for (QuestionsV1 questions : questionsList) {
        if (questionsList != null && ((first_number == questions.getFirst_number() && second_number == questions.getSecond_number())
                || (first_number == questions.getSecond_number() &&
                second_number == questions.getFirst_number()))) {
            generateQuestionsArray(level, range);
            break;
        }
    }
    Log.d("ArrayList---", first_number + " " + second_number);
    QuestionsV1 questions = new QuestionsV1();
    questions.setFirst_number(first_number);
    questions.setSecond_number(second_number);
    questions.setOperator("x");
    questions.setCorrect_answer(first_number * second_number);
    return questions;
}


public void generateRandomNumbers(int level, int range) {
    Random rand1 = new Random();
    Random rand2 = new Random();
    if (range == 0) {
        first_number = rand1.nextInt(3 - 1 + 1) + 1;
    } else if (range == 1) {
        first_number = rand1.nextInt(6 - 4 + 1) + 4;
    } else if (range == 2) {
        first_number = rand1.nextInt(10 - 7 + 1) + 7;
    }
    switch (level) {
        case 1:
            second_number = rand2.nextInt(6 - 2 + 1) + 2;
            break;
        case 2:
            second_number = rand2.nextInt(12 - 7 + 1) + 7;
            break;
        case 3:
            second_number = rand2.nextInt(20 - 13 + 1) + 13;
            break;

    }

below is the error which I am getting.

   Fatal Exception: java.lang.StackOverflowError: stack size 2MB
   at java.util.concurrent.atomic.AtomicLong.<init>(AtomicLong.java:61)
   at java.util.Random.<init>(Random.java:137)
   at java.util.Random.<init>(Random.java:105)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:80)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbers(Multiply.java:106)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateQuestionsArray(Multiply.java:39)
   at com.leapscale.scimat.t4e.Builders.Multiply.generateRandomNumbersHard(Multiply.java:74)
   at com.leapscale.scimat.t4e.Builders.Multiply.calculateNoOfQuestionsForLevels(Multiply.java:141)
   at com.leapscale.scimat.t4e.Builders.Multiply.getList(Multiply.java:146)
   at com.leapscale.scimat.t4e.Levels.Levels_Fragment$QuestionBuilder$1.run(Levels_Fragment.java:185)
   at java.lang.Thread.run(Thread.java:761)




Aucun commentaire:

Enregistrer un commentaire