субота, 05. децембар 2015.

Biranje slučajnih brojeva, Random u C# programskom jeziku


U programskim jezicima ne postoji slučajnost ili izaberi šta god hoćeš. Sve je savršeno precizno i tačno se zna šta će koja naredba izvršiti. Međutim i jedna od najvećih potreba u pravljenju igrica je da kompjuter sam nasumično izabere jednu od ponuđenih opcija. Npr. kad pravite kompjutersku igricu u kojoj objekti lete prema vama, imaće te potrebu da se objekti i pored toga što se primiču i uvećavaju prema vama da program sam odluči da li objekat se pomera u levo ili desno. Tako i stotine sličnih situacija i detalja u igrici moraju da biraju jednu od više opcija nasumično. Inače bi svaki pokret igrice kad god se pokrene uvek bio isti i vi bi ste tačno znali unapred svaki potez igrice koji će se desiti. Drugi, očigledniji primer je loto. U Srbiji se za jednu kombinaciju bira 7 brojeva od 1 do 39. Da bi računar mogao da nasumično bira brojeve, skoro svi programski jezici u kojem programirate mora da sadrži pseudo generatore biranja slučajnih brojeva.


( Random, pseudo generator biranja brojeva se koristi najviše u igrama na sreću )

U C# programskom jeziku, pseudo generator biranja slučajnih brojeva je klasa Random, koja se već nalazi u imenskom prostoru System, tako da nemate potrebe da naknadno uvozite klasu u vaš program kako bi ste je mogli koristiti. 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. Npr. ako hoćete da birate broj između -100 i 100 onda će te inicijalizovati metodu ovako.

Random rnd = new Random();
rnd.Next(-100, 101);

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?


Postoji više načina kako se programiraju programi za izvlačenje loto brojeva. Pogledajte program za izvlačenje brojeva za loto, i ne samo za izvlačenje brojeva; već i njegovu optimizaciju za povećanje verovatnoće da će broj biti izvučen u C programskom jeziku ovde. Koliko daleko vi hoćete da radite na vašem programu za izvlačenje brojeva i koje sve vaše ideje hoćete da mu dodate je samo na vama. Ovaj program je odličan ali je ograničen na igranje Lotto-a samo u Srbiji. Zato pogledajte kod u sledećem programu u C# programskom jeziku gde vam predstavljam primer da vi možete sami da izaberete koliki opseg brojeva se izvlači i koliko brojeva. Dalju optimizaciju i koliko kombinacija vi želite da vam program prikazuje ostavljam da implementirate vama. Pogledajte kod programa.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RandomNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            byte number, range, picked;
            bool correct;

            WriteLine("\t\tTHE UNIVERSAL LOTTO\n");

            do
            {
                Write("\tWhat maximum range of numbers in the lottery\n\tin your country (Maximum 100)? ");
                correct = Byte.TryParse(ReadLine(), out range);

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

            correct = false;

            do
            {
                Write("\tHow many lottery numbers\n\tyou choose in your country (Maximum 10)? ");
                correct = Byte.TryParse(ReadLine(), out picked);

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

            correct = false;

            byte[] rangeArray = new byte[range];
            byte[] pickedArray = new byte[picked];

            Random rnd = new Random();

            for (byte i = 0; i < range; i++)
            {
                rangeArray[i] = (byte)(i + 1);

            }

            WriteLine("\n\tYour lotto numbers are:\n\n");

            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();
                ReadKey();

            }

        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;
        }
    }
}

U navedenom programu Universal Lotto smo napravili niz range dužine koju odredite i ispunili ga brojevima od 1 do veličine koju korisnik odredi. Tako će korisnici iz Srbije imati niz od 39 elemenata dok će većina korisnika iz USA koji igraju Supper Lotto Plus imati niz od 47 elemenata. Tako klijenti iz Srbije biraju 7 brojeva dok će klijenti iz USA birati 5. Naravno da bi greške bile izbegnute, program vam ne dozvoljava da možete imati rang veći od 100, kao što vam i ne dozvoljava da možete birati više od 10 brojeva. Vi to možete u kodu promeniti ako čujete da negde postoji loto sa tolikim opsegom. Kombinacijom petlji i inicijalizovane Random naredbe program će izvući nasumično izabrane brojeve. Obratite pažnju i na funkciju koja provera da li izabrani niz brojeva ima duplikat. Ona je baš retkost, jer kad imate potrebe za manipulaciju sa nizovima, programeri radije koriste kolekcije. Kad pokrenete program, rezultati nikad neće biti isti. Svaki put će brojevi biti drugačije izabrani.

                           UNIVERSAL LOTTO

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

         you choose in your country (Maximum 10)? 7

         Your lotto numbers are:

         4         7         9         17         22         26         36


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

 

( C# 6.0 Tutorial - Fundamentals - 20. Random )