co zrobic zeby liczby losowe sie nie powtarzały

0

cześć kodu co zrobić żeby liczby losowe sie nie powtarzały ?

static void Main(string[] args)
        {
            Console.WriteLine("Nadawnie tablicy elemtów losowych");
            string Zmienna;
            Random Generator;
            int Ileliczb, Szukana, i, indeks, dlugosc;
            int[] Wektor;
            Generator = new Random();
            Console.WriteLine("Podaj liczbę elementów tablicy:");
            Zmienna = Console.ReadLine();
            Ileliczb = Int32.Parse(Zmienna);
           
             Wektor = new int[Ileliczb];
            for (i = 0; i < Wektor.Length; i++)//petla zapelniajaca tablice elemtami
                Wektor[i] = Generator.Next(10);

            Array.Sort(Wektor);
            for (i = 0; i < Wektor.Length; i++)//petla zapelniajaca tablice elemtami
                Console.WriteLine(i + ". elemt: " + Wektor[i]);
0

True, ostatnio jest jakiś wysyp tego.

Hint? Stwórz jeden globalny Random i z niego pobieraj liczby. Tworzenie kilku generatorów w krótkim okresie czasu może spowodować wybranie wspólnego seeda i w konsekwencji zwracanie identycznych liczb.</del>

EDIT: Sorry, pospieszyłem się, teraz widzę że tam jest jeden obiekt generatora - chciałem rozwiązać nieistniejący problem :<

0

wstawiłęm cos takiego ale nia działa

            Wektor = new int[Ileliczb];
            for (i = 0; i < Wektor.Length; i++)//petla zapelniajaca tablice elemtami
            {
                Wektor[i] = Generator.Next(10);

                for (j = 0; j < i; j++)

                    if (Wektor[i] == Wektor[j])
                        while (Wektor[i] == Wektor[j])

                            Wektor[i] = Generator.Next(10);
            }
0

stwórz metodę random jako statyczną i/lub użyj RNGCryptoServiceProvider

 public static byte GetRandom()
    {
        RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
        // Create a byte array to hold the random value.
        byte[] randomNumber = new byte[1];

        rngCsp.GetBytes(randomNumber);

        return randomNumber[0];

    }
 
2

tworzysz tablice z liczbami z przedziału [a,b] (po kolei, nie żadne losowe), następnie losowo zamieniassz miejscami pozycje w tej tablicy (http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp)

1

tworzysz tablice z liczbami z przedziału [a,b] (po kolei, nie żadne losowe), następnie losowo zamieniassz miejscami pozycje w tej tablicy (http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp)

+1, jedyna poprawna na razie odpowiedź.

Dodatkowo jeśli jesteś ambitny:
http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

Jeśli jesteś mało ambitny, szybki sposób:

var arr = Enumerable.Range(start, ct).OrderBy(x => r.Next()).ToArray();

Jeśli zamierzasz wylosować dużo mniej elementów niż jest w przedziale, losuj normalnie (r.Next()) i trzymaj już wylosowane w HashSecie. Jesli jakieś się powtórzą, nie zwracaj tylko losuj jeszcze raz (przykładowy kod, niezbyt bezpieczny - np. wpadnie w końcu w nieskończoną pętlę itp - ale chodzi o zasadę)

int GetUnique() {
    int next;
    do {
        next = r.Next();
    } while (set.Contains(next));
    return next;
}
0

nie mogę tego złożyć pomoze ktos ?

0
//Inicjalizacja potrzebnych obiektów
List<int> randomedNumbers = new List<int>();
Random random = new Random();

//Ilość liczb do wylosowania
int numbersToRandom = 10;

for(int i=0;i<numbersToRandom;i++)
{
    while(true)
    {
        //Generujemy liczbę
        int generatedNumber = random.Next(10);

        //Jeżeli nie mamy jeszcze takiej liczby wylosowanej
        if(randomedNumbers.Find(p => p == generatedNumber) == 0)
        {
            //Dodajemy liczbę do listy i przerywamy pętle
            randomedNumbers.Add(generatedNumber);
            break;
        }
    }
}

Pisane z palca ale powinno działać. Tutaj akurat zastosowałem listy, ale na końcu wystarczy jedną linią zrobić randomedNumbers.ToArray() i będzie.

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