Skocz do zawartości
  • 0

Generowanie randomowych liczb


Pitagoras333
 Udostępnij

Pytanie

"Stwórz funkcję, która rekurencyjnie uzupełnia tablicę losowymi liczbami z przedziału obustronnie domkniętego (1;99) i zademonstruj jej działanie."

Napisałem coś takiego, ale losuje pierwszą i drugą liczbę, a reszta tablicy jest wypełniona tą drugą zamiast kolejnymi wylosowanymi.

 

  static void f1(int[] tab, int n=0)
        {
            Random rand = new Random(DateTime.Now.Millisecond);
            if(n==tab.Length)
            {
                return;
            }
            tab[n] = rand.Next(1, 100);
            f1(tab, n + 1);
            
        }

edit: gdy opóźnię program jakąś bez sensowną pętlą która np cały czas coś mnoży przez siebie, to liczby losują się poprawnie czyli to chyba coś z czasem nie tak ale nie widzę tam możliwości wyboru mniejszej jednostki niż "Millisecond" xD

Edytowane przez Pitagoras333
Odnośnik do komentarza
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Zamień

Random rand = new Random(DateTime.Now.Millisecond);

na

var rand = new Random();

Zamiana Random na Var nie jest obowiązkowa, ale przyjęte jest, że używamy go gdy typ można wywnioskować z prawej strony. Uzasadnienie czemu tak to działa jest w zaakceptowanej odpowiedzi https://stackoverflow.com/questions/1785744/how-do-i-seed-a-random-class-to-avoid-getting-duplicate-random-values.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Zaczynając od początku. Jeśli mówimy o komputerach i losowości to nie możemy mówić, że liczby są losowe tylko pseudolosowe. Kiedy weźmiemy na tapet dokumentację klasy Random, dowiemy się, że:

Cytat

Pseudo-random numbers are chosen with equal probability from a finite set of numbers. The chosen numbers are not completely random because a mathematical algorithm is used to select them, but they are sufficiently random for practical purposes. The current implementation of the Random class is based on a modified version of Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. The Art of Computer Programming, Volume 2: Seminumerical Algorithms. Addison-Wesley, Reading, MA, third edition, 1997.

i

Cytat

You instantiate the random number generator by providing a seed value (a starting value for the pseudo-random number generation algorithm) to a Random class constructor. You can supply the seed value either explicitly or implicitly:

  • The Random(Int32) constructor uses an explicit seed value that you supply.
  • The Random() constructor uses the system clock to provide a seed value. This is the most common way of instantiating the random number generator.

Źródło: Random Class (System) | Microsoft Docs

 

Teraz kiedy już wiemy czym jest seed oraz skąd się bierze (poprzez zadeklarowanie lub poprzez pobranie go z zegara systemowego) idziemy jeszcze dalej.. Jeśli w Twoim kodzie jako seed przekażesz n i zaczniesz włączać program zauważysz, że zawsze losują się te same liczby. W normalnych warunkach powinno się mieć jedną instancję klasy Random i na niej pracować wywołując metodę Next()Na potrzeby tego algorytmu za każdym razem tworzysz nową instancję klasy Random. Zakładając, że kod wykona się odpowiednio szybko jako seed zostanie przekazana ta sama liczba. Sam zauważyłeś, że w momencie kiedy sztucznie spowolniłeś program zaczął on działać. 

 

GUID to Global Unique Identifier, za każdym razem jest tworzona nowa instancja GUID'a i pobierany jest hash code., dzięki czemu liczby są zawsze unikalne.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Zaloguj się poniżej.

Zaloguj się
 Udostępnij

  • Ostatnio przeglądający forum Generowanie randomowych liczb   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...