Własna funkcja losującą

0

Witam sz. Forumowiczów.

Zabrałem się wczoraj za pisanie własnej funkcji wrappującej funkcje losującą z .NET. Mój problem polega na tym, że funkcja dziwnie się zachowuję, tzn sama siebie powtarza, na dowód dołączę output z NUnit.

 
        public int Randomize(int minVal, int maxVal) // zakres np. od 0 do 7 
        {
            Console.WriteLine("Przed: "+m_randomedNumbers.Count); // dla wyjscia
            int randomedNumber = -1;
            if (Equals(m_randomedNumbers.Count, maxVal + 1)) // gdy 8 elementów [patrz przykładowy zakres]
                m_randomedNumbers = new List<int>(); //nową listę generować czy lepiej .Clear();(??)

            bool hasRandomed = true;
            while(hasRandomed)
            {
                randomedNumber = m_random.Next(minVal, maxVal);
                if (Equals(m_randomedNumbers.Count, 0)) // jeśli lista ma 0 elementów, to nie sprawdzamy jej
                {
                    hasRandomed = false;
                    continue;
                }
                if (!m_randomedNumbers.Contains(randomedNumber))
                {
                    hasRandomed = false;
                }
            }

            m_randomedNumbers.Add(randomedNumber);
            Console.WriteLine("randomedNumber: " + randomedNumber); // tu też output

            return randomedNumber;
        }

Chyba, że nie potrzebnie tworze listę przechowującą już wylosowane liczby i sprawdzam ją :F. Czy obiekt Random() ma własny stos? -- przynajmniej, ja takiej informacji nie mogę znaleźć.

A to mi wypluwa output w NUNIT:

 Przed: 0
randomedNumber: 3
Przed: 2
randomedNumber: 6
Przed: 4
randomedNumber: 2
Przed: 6
randomedNumber: 1
Przed: 8
randomedNumber: 9
Przed: 10
randomedNumber: 5
Przed: 0
randomedNumber: 4
Przed: 2
randomedNumber: 5
Przed: 4
randomedNumber: 8
Przed: 6
randomedNumber: 2
Przed: 8
randomedNumber: 3
Przed: 10
randomedNumber: 6
Przed: 0
randomedNumber: 2
*Expected: 1
*Actual: 1

To coś, test zdaje, ale nie wiem czemu się tyle razy powtarza, gdy używam pętli. Boje się dużego narzutu na procesor, przy większym zakresie. "przed" i "randomedNumber" powinny się tylko raz pokazać, bez względu na ilość przebiegów pętli wewnątrz funkcji.

0

Spróbuj tak:

Random rnd = new Random();
public int randomNumber(minValue, maxValue)
{
    int rndNumber = rnd.Next(minValue, maxValue);
    return rndNumber;
}
//A jak chcesz wyświetlić losową liczbę, to np:
Console.WriteLine("Losowa liczba: " + randomNumber(0, 10));
2

Spróbuj tak: [...]

Imo potrzebujemy zejsc nizej.

class MyAwesomeRandom
{
	static Random rng = new Random();
	public int rand(int min, int max)
	{
		return rand_(min, max);
	}
	
	private int rand_(int min, int max)
	{
		return rand__(min, max);
	}
	
	private int rand__(int min, int max)
	{
		return rand___(min, max);
	}
	
	private int rand___(int min, int max)
	{
		return rand____(min, max);
	}
	
	private int rand____(int min, int max)
	{
		return rand_____(min, max);
	}
	
	private int rand_____(int min, int max)
	{
		return rng.Next(min, max);
	}
}

public class Test
{
	
	public static void Main()
	{
		var random = new MyAwesomeRandom();
		Console.Write(random.rand(10, 20));
	}
}
0

Padłem... :D

0

już rozwiązałem ten problem... zapomniałem użyć przeciążonego konstruktora <rotfl> (to się wygłupiłem), w defaultowym funkcja jest uruchamiana 12 razy.
Najwyraźniej efekt późnej godziny, i kiepski kod powstaje.

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