Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz
  • 0

Generowanie randomowych liczb


Pitagoras333

Pytanie

Opublikowano

"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

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

Opublikowano

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.

Opublikowano

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.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...