Thursday, September 17, 2020

Klasa Random, biranje slučajnih brojeva u C# programskom jeziku

Najbolja stvar kod računara je što vas sluša. Kod njega nema ni levo ni desno, nego samo tačno kako ste mu naredili. Njegova akcija je uglavnom predvidljiva i kad ne dobijete od računara ono što očekujete to definitivno znači da ste vi pogrešili, a ne on. Ili nešto nije u redu na dubljem nivou!  Međutim, postoje situacije kad ćete hteti da računar bira jedan od više ponuđenih brojeva ili opcija. Na primer kada programirate igrice, kvizove, testove ili programirate Loto programe koji biraju brojeve umesto vas. Reći računaru da nešto izabere nije baš za njega jednostavan proces. Zato on ima specijalnu klasu Random, koja nasleđuje Object koji predstavlja generator pseudo slučajnih brojeva ili još preciznije Object koji sadrži algoritam koji stvara niz brojeva koji zadovoljavaju određene statističke zahteve za slučajnost. Zahvaljujući tome, biranje slučajnih brojeva u vašem programiranju jeste jednostavno. Vi čak ne morate ni da dodatno uvozite imenski prostor za ovu delatnost jer se Random klasa nalazi u System imenskom prostoru.  

( Random klasa je zadužena za bilo kakvo biranje slučajnih brojeva )

Da stvar bude još jednostavnija, korišćenje naredbe Random u C# programskom jeziku je mnogo jednostavnije nego u C ili C++ programskom jeziku. Metoda Next() je preklopljena i njene druge verzije vam omogućavaju da odredite minimalnu i maksimalnu vrednost opsega. Ona podrazumevano vraća pozitivan integer u opsegu od 0 do maksimalne vrednosti Int32. Ali ako odredite opseg od jednog broja do drugog, možete birati i negativne brojeve. Na primer ako hoćete da birate broj između -100 i 101 onda će te inicijalizovati metodu ovako. 

Random rnd = new Random();

rnd.Next(-100, 101);

I to je sve. I ako imate potrebu da birate više puta, dovoljno je da koristite istu rnd promenjivu čak i sa drugačijim postavkama. Nema potrebe da razmišljate da će svaki put kad izvršite ovaj kod da dobijate isti broj jer podrazumevani konstruktor za klasu Random dodeljuje generatoru slučajnih brojeva početnu vrednost koja je vremenski zavisna, tako da se smanjuje sekvenca biranja istih brojeva. Klasa Random sa njenom metodom Next() je sasvim dovoljna da precizno radite testove, iako su u nekim projektima uključeni razne vrste algoritma da bi slučajni broj bio dodatno naizmeničan broj.

Kako da napravim jednostavan program za izvlačenje Loto brojeva?

Svima je već poznato da se u Srbiji dvaput sedmično izvlače Loto brojevi. Bira se 7 brojeva u rasponu od 1 do 39, dok u drugim državama to nije slučaj. Na primer u Hrvatskoj Lutriji se izvlači 7 brojeva ali u rasponu od 1 do 35, dok u Bosni i Hercegovini u Super Lotu se izvlači 6 brojeva ali u rasponu od 1 do 45. Da bi naš program bio koristan i u drugim državama, mi ćemo napraviti jedan mali program koji će omogućiti korisniku da prvo unese raspon brojeva zatim i koliko se brojeva izvlači. Ovaj program se neće baviti većom verovatnoćom da izabrani brojevi imaju veće šanse da budu izabrani već će jednostavno izabrati određen broj slučajnih brojeva u datom rasponu. Za sve vas koji se bavite profesionalno Loto brojevima i većom verovatnoćom da brojevi budu izvučeni možete pogledati mali program koji sam još pre 5 godina programirao u C programskom jeziku i koji je već izazvao veliko interesovanje. Naravno, vi možete i ovaj program dograditi, kako vama odgovara. Pokrenite Visual Studio Code, otvorite novi folder i nazovite ga Loto. Zatim u terminal panel unesite sledeću komandu:

dotnet new console

Kliknite na datoteku Programs.cs i možemo da počnemo da pišemo kod.


using System;

using static System.Console;

 

namespace lotto

{

    class Program

    {

        static void Main(string[] args)

        {

            byte number, range, picked;

            bool correct;

 

            WriteLine(Environment.NewLine + "\t\t\tLOTTO NUMBERS" + Environment.NewLine);

 

            do

            {

                Write("\tWhat maximum range of numbers in the lottery in your country (Maximum 100)? ");

                correct = Byte.TryParse(ReadLine(), out range);

                

            } while (!correct && range > 100);

 

            correct = false;

 

            do

            {

                Write("\tHow many lottery numbers you choose in your cointry (Maximum 10)? ");

                correct = Byte.TryParse(ReadLine(), out picked);

                

            } while (!correct && picked > 10);

Prvo pravimo statičnim imenski prostor za konzolu, kako bi smo mogli da pišemo kod kraće. Zatim deklarišemo 4 promenjive i to 3 promenjive tipa byte jer radimo sa malim brojevima i jedna bool promenjiva koja će nam reći da li je neka akcija tačna ili netačna. Postavljamo naslov programa tako što ga malo pomeramo udesno koristeći specijalni karakter za tab, \t . Isto tako ste mogli umesto Environment.NewLine da koristite \n za prelazak u novi red. Ovde to nije urađeno samo radi čitljivosti. Zatim postavljamo korisniku prvo pitanje, koliki rang ili opseg imaju brojevi u Lotu u njegovoj državi. Ovo pitanje stavljamo u petlju do … while . Zašto baš tu petlju? Zato što će se izvršiti bar jednom, i nju koristimo da bi smo ignorisali pogrešan unos korisnika. Kako ne bismo morali ispravljati greške. Na žalost, iz nekog razloga ovo ne funkcioniše trenutno u Visual Studio Code-u. Ako uneste range vrednost veću od 100 program će nastaviti dalje umesto da ponovi pitanje. Tako da morate unositi prave vrednosti. Zatim isto tako radimo i sa koliko ima izvučenih brojeva. Unesite sledeći kod.

            byte[] rangeArray = new byte[range];

            byte[] pickedArray = new byte[picked];

 

            Random rnd = new Random();

 

            for (int i = 0; i < range; i++)

            {

                rangeArray[i] = (byte)(i + 1);

 

            }

 

            WriteLine(Environment.NewLine + "\tYour lotto numbers are: " + Environment.NewLine);


U navedenom kodu, pravimo dva niza i za rang brojeva i za određen broj izvlačenja loto brojeva. Zatim prvo punimo prvi niz brojevima u rangu. Znači ako igrate loto u Srbiji, niz range će biti napunjen brojevima od 1 do 39. Zašto to radimo? Da bi smo izbegli duplikate. Ne želimo da se više puta izvlači jedan te isti broj. Zato nam je potreban niz. I za naš niz koristimo for petlju koja je idealna za ovaj zadatak. Naravno, neophodno je napraviti i statičnu funkciju koja će proveriti duplikate. Nju pišite ispod funkcije Main().

 

  public static bool ContainsDuplicates(byte[] array)

        {

            for (byte i = 0; i < array.Length; i++)         

            {

                for (byte j = (byte)(i + 1); j < array.Length; j++)

                {

                    if(array[i] == array[j]) return true;

                }

             }

             return false;

         }

    }


Zatim pravimo novu petlju do … while koja iz nekog razloga za razliku od prethodnih rade svoj posao.

 

            do

            {

                for (byte k = 0; k < picked; k++)

                {

                    number = rangeArray[rnd.Next(range)];

                    pickedArray[k] = number;                  

                }

 

            } while (ContainsDuplicates(pickedArray));

 

            Array.Sort(pickedArray);

 

            foreach (byte item in pickedArray)

            {

                Write($"\t{item}");

 

            }

 

            WriteLine();

            WriteLine();

        }

 

U navedenoj petlji će se izvući 7 brojeva. Ako ima duplikat među tim brojevima, brojevi će se ponovo izvući. Kad se napusti do … while petlja koristimo Array klasu kako bi smo sortirali brojeve. Na taj način ne morate da pišete kod za sortiranje. Pogledajte kako izgleda program kad se izvrši:

 

                                              LOTTO NUMBERS

 

        What maximum range of numbers in the lottery in your country (Maximum 100)? 39

        How many lottery numbers you choose in your cointry (Maximum 10)? 7

 

        Your lotto numbers are:

 

        11      14      23      24      25      35      36

 

Kako to sve izgleda možete pogledati i na video-u:


( C# & .NET Core - 21. Random Class - Lotto Numbers Example )


  

 

 

 

 

 

 

1 comment:

  1. This comment has been removed by a blog administrator.

    ReplyDelete