Náhodná čísla - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

Náhodná čísla

java

17. května 2002, 00.00 | Občas se stane, že potřebujete vygenerovat nějaké specifické náhodné číslo. Pojďme se tedy podívat, jak se dají náhodná čísla v Javě generovat.

Generování náhodných čísel patří u většiny jazyků k jedněm ze základních vlastností. Vesměs základní představa o náhodném čísle je, že náhodné číslo je číslo v rozsahu 0 až 1. Tato představa není zcela korektní a v průběhu následujících řádků si ji upřesníme.

Základním způsobem, jak se v Javě získá náhodné číslo, vychází z metody random třídy Math.

     double my_random;
     my_random = Math.random();

Tento příklad odpovídá naší základní představě o náhodném číslu jako o číslu v rozsahu 0 až 1.

Důležitá poznámka autora: již jsem zde několikráte zmínil slovo náhodné číslo a přesto zde v podstatě o náhodném čísle vůbec nemluvím. Asi bych to měl vysvětlit, co? Tento pojem je zavádějící z prostého důvodu, že počítače nejsou schopny, stejně tak jako lidský mozek, opravdu vymyslet pravé náhodné číslo. V obou případech je toto číslo získáno výpočtem. Jestli si pamatuji dobře, tak u PC bývá tento výpočet založen na časovači. Této vlastnosti si všimli i vojáci a v podstatě dokázali, že za sebou generovaná náhodná čísla vytvářejí jistou řadu, která lze predikovat. Proto pro své šifrovací potřeby vyvinuly speciální systémy pracující např. na pricipu rozpadu atomů. Ale ani tato metoda negeneruje pravé náhodné číslo, pouze minimalizuje tu možnost, že by se dal najít nějaký sofistikovaný výpočet na získání tohoto čísla. Celé je to umocněno faktem, že v současné době nikdo dost dobře nepochopil veškeré fyzikální jevy, které tento výběr řídí. Doufám, že tímto malinkým nakousnutím problému, jsem vám alespoň trochu ozřejmil fakt, že opravdové náhodné číslo v podstatě neexistuje, prozatím.

Jelikož jsem zde již naznačil, že náhodná čísla mají nějaké svou řadu, tak bychom se mohli podívat, jak tuto řadu využít. V prvním příkladě sice řada existuje, ale počítač si její existence není vědom. Proto vznikla možnost generování pseudo-náhodných čísel. Generátoru stačí jen zadat řadu a následně je schopen vytvářet vždy stejnou řadu „náhodných“ čísel.

// soubor randomize.java
import  java.util.*;

public  class  randomize
{
     public  static  void  main(String  args[]) {
               Random rand = new  Random(11111); // nastavení řady
               System.out.println("Random 1: " +rand.nextInt());
               System.out.println("Random 2: " +rand.nextInt());

               rand.setSeed(11111); // opětovné nastavení řady
               System.out.println("Random 1: " +rand.nextInt());
               System.out.println("Random 2: " +rand.nextInt());
     }
}

Příklad využívá třídy Random. Pří vytvoření ji lze předat tzv. Seed, což je pravé číslo „náhodné“ řady. Nezadáte-li ho, použije se aktuální čas. To má za následek, to že neznáte řadu a tudíž generovaná číslo jsou pro vás náhodná — neopakovatelná, stejně jako při Math.random(). Seed lze také změnit po vytvoření objektu metodou setSeed. Příklad má vracet vždy stejná náhodná čísla.

Random 1: 638999618
Random 2: 1167470352

Random 1: 638999618
Random 2: 1167470352

Třída Random se dá využít k generování náhodných čísel v předem požadovaném formátu1.

  • nextDouble – vrací double v rozmezí 0 až 1
  • nextFloat – stejně jako u double, pouze jiný primitivní datový typ
  • nextInt – první z celočíselných datových typů v rozmezí -2147483648 až +2147483647
  • nextLong – další celočíselný typ, tentokráte v rozsahu -922337203685775808 až +9223372036854775807
  • nextGaussian – generuje náhodná číslo s přednastaveným rozložením. Přesně řečeno s Gausovým rozložení tj. se střední hodnotou 0.0 a odchylkou 1.0.

Nejprimitivnější ukázka pak může vypadat takto:

     Random rand = new  Random();
     double d = rand.nextDouble();
     float f = rand.nextFloat();
     int i = rand.nextInt();
     long l = rand.nextLong();
     double g = rand.nextGaussian();

Ještě jsem se nezmínil o jedná často požadované vlastnosti náhodného čísla, a to požadovaném rozsahu. Jak na to? Použije nám již známou třídu Random s jejím přepočtem

Random rand = new  Random();
int i = rand.nextInt()%255; // rozsah -255 až +255
int i = Math.abs(rand.nextInt()%255); // rozsah 0 až 255

V prvním případě vytvoříme symetrickou množinu od -255 až po +255. V druhém, používanějším, vytvoříme rozsah od 0 .. 2552.

A to je vše. Zdrojové kódy


1. – Math.random() generuje primitivní datový typ double
2. – v Javě tomu paradoxně neodpovídá primitivní datový typ byte!

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: