Dlaczego mój kod powoduje wyjątek StackOverflowException?

0

Mam taki kod:

        int getlosowepytanie()
        {
            
            rand = new Random();

            number = rand.Next(0, iloscpytan - 1);
            if (uzytePytania[number] == 1)
            {
                return getlosowepytanie();
            }
            else
            {
                return number;
            }
        }

i wywala

System.StackOverflowException: 'Zgłoszono wyjątek typu 'System.StackOverflowException'.'
1
            rand = new Random();

wynieś to z funkcji do klasy.

1

Wyjaśnienie krótkie:

Powinieneś mieć TYLKO JEDEN obiekt klasy Random w CAŁEJ aplikacji. Tzn. musisz go utworzyć TYLKO RAZ. Ty tworzysz go ciągle w swojej metodzie. Powoduje to, że wylosowana liczba zawsze jest taka sama.

Często robi się jakiegoś singletona lub statica, żeby to ogarnąć, np:

public static class RandomHelper
{
    static Random random;

    static RandomHelper()
    {
        random = new Random();
    }

    public int GetRandomInt(int min, int max)
    {
        return random.NextInt....
    }
}

Możesz sobie też zwracać samego random albo możesz z tego zrobić singletona. W zależności od potrzeb.
Dla malkontentów - tak, singleton w tym wypadku jest dobrym rozwiązaniem.

1
           number = rand.Next(0, iloscpytan - 1);
           if (uzytePytania[number] == 1)
           {
               return getlosowepytanie();
           }

Ja jeszcze dodam, że to jest zły algorytm losowania bez powtórzeń - już dla kilkunastu elementów pod koniec (kiedy większość elementów już była wylosowana) zaczyna działać BARDZO wolno. A tu jeszcze dojdzie przepełnienie stosu.

0

Powinieneś kombinować coś w tym kierunku:

var questionsIndexes = new List<int> { 0, 1, 2, 3, 4, 5, 6 };
var listIndex = random.Next(questionsIndexes.Count - 1);
var index = questionsIndexes[listIndex];
questionsIndexes.Remove(index);
0

Tak na przyszłość . Wklejaj cały kod . Taki błąd wyskakuje wtedy jak funkcja wywołuje samą siebie zbyt dużą liczbę razy.
U mnie taki błąd pojawia się gdy liczba powtórzeń przekroczyła 64547. Zabrakło pamięci na stosie . To jest chyba uzależnione do zasobów komputera.
W takich przypadkach lepiej robić pętle.
Jak funkcja wywołuje następną funkcję to tworzony jest stos wywołań funkcji . Po zakończeniu funkcje są kolejno zdejmowane ze stosu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1