Psevdo-naključno število

Iz MaFiRaWiki

Ta članek ali del članka je v delu. Veseli bomo, če ga boste dopolnili in popravili.

Kaj pomeni to opozorilo?

Tako imenovana naključna števila so pomemben del pri mnogih aplikacijah.

Vsi generatorji naključnih števil ustvarjajo zaporedja oziroma nize števil z uporabo usteljenih pravil, ki ustvarijo vsako število v nizu iz njegovega predhodnika. To pomeni, da števila v resnici niso naključna, so napovedljiva, poznamo pravilo po katerem so bila narejena.

Edini način, da bi dobili resnično naključna števila, je da bi uporabili neki fizikalni proces, ki je sam po sebi naključen (kot na primer metanje kocke ali kovanca). Neglede, računalnik lahko ustvari niz števil, ki bi na pogled izgledala kot naključna števila, ljudjem ki ne bi poznali pravila generiranja števil. Števila, ki so bila računalniško generirana in zadovoljujejo statistične teste imenujemo psevdonaključna števila.

Vsebina

Primeri

Oglejmo si kako se uporablja v javo vgrajeni generator psevdonaključnih števil. V ta namen v javi uporabljamo razred Random. Na volo je tudi metoda random v razredu AMth, a je načeloma razred Random uporabnejši.

Naključno število na intervalu z dano zgornjo mejo

Razlaga algoritma:

  • kot argument sprejmemo zgornjo mejo intervala, na keterem bomo generirali naključna števila
  • v if stavku lovimo izjemo IllegalArgumentException; če je zgornja meja negativno število ali pa je enaka nič
  • nato naredimo nov "generator", ki je tipa Random
  • vrnemo psevdonaključno število, celoštevilsko vrednost, ki je poenoteno porazdeljena na intervalu med 0 in , v našem primeru, zgornja meja -1

  1. public int izberiStevilo(int zgMeja){
  2. if (zgMeja <=0) {
  3. throw new IllegalArgumentException("Zgornja meja mora biti pozitivno stevilo: " + zgMeja);
  4. }
  5. // ce bomo uporabili konstrukotor brez parametra, bo vrednost semena enaka trenutnemu casu
  6. // tako bodo imeli "random" objekti, ki so bili narejeni v hitrem nizu,
  7. // enako seme in bodo generirali enako sekvecno
  8. Random generator = new Random();
  9. return generator.nextInt(zgMeja);
  10. }


Naključno število na intervalu z dano spodnjo in zgornjo mejo

Razlaga algoritma:

  • metoda sprejma dva argumenta, prvi je spodnja meja intervala, drugi pa je zgornja meja intervala
  • v if zanki lovimo izjemo IllegalArgumentException, če je slučajno vrednost zgornje meje manjša od vrednosti spodnje meje
  • ustvarimo novi generator, ki je tipa Random
  • izračunamo interval na katerem generiramo psevdonaključna števila; "interval" smo shranili v tip long, da bi se izognili prekoračitve meje
  • z metodo generator.nextDouble(), dobimo psevdonaključno število (realno število), ki je poenoteno porazdeljena na intervalu med 0.0 in 1.0
  • izračunemo odlomek intervala
  • kot rezultat pa metoda vrača, celo število, ki ga dobilo po formuli

Opomba: če v konstruktorju nimamo nobenega argumenta, se bo za seme vzelo trenutni čas

  1. public int izbiraStvIntervalu(int spMeja, int zgMeja) {
  2. if (spMeja >= zgMeja) {
  3. StringBuilder message = new StringBuilder();
  4. message.append("Spodnja meja (");
  5. message.append(spMeja);
  6. message.append(") mora biti manjsa od zgornje meje (");
  7. message.append(zgMeja);
  8. message.append(")");
  9. throw new IllegalArgumentException(message.toString());
  10. }
  11.  
  12. Random generator = new Random();
  13. // dolocimo interval; vzamemo tip long, da se izognemo prekoracitve mej
  14. long interval = (long)zgMeja - (long)spMeja + 1;
  15. // izracunamo odlomek intervala, pri cemer mora veljati: 0 <= odlomek < interval
  16. long odlomek = (long)(interval * generator.nextDouble());
  17. return (int)(odlomek + spMeja);
  18. }

Naključna števila v tabeli

Razlaga programa:

  • v if zanki lovimo izjemo IllegalArgumentException, če je zgornja meja manjša ali enaka nič in če je niz, ki ga na koncu izpisujemo enak nič
  • generiramo generator, ki je tipa random in rezultat, ki je tipa ArrayList (tabela, ki ji lahko sprot spreminjamo velikost)
  • s for zanko se sprehodimo po našem nizu, ki ga na koncu izpišemo
  • kot rezultat medota vrne niz z psevdonakljičnimi števili, ki smo mu velikost določili z vhodnim paramatrom

  1. public List izberiStevila(int zgMeja, int velikostNiza) {
  2. if (zgMeja <=0) {
  3. throw new IllegalArgumentException("Zgorna meja mora biti pozitivno stevilo: " + zgMeja);
  4. }
  5. if (velikostNiza <=0) {
  6. throw new IllegalArgumentException("Velikost niza mora biti vecja kakor 0.");
  7. }
  8.  
  9. // veckratna uporaba istega "random" objekta, da generira niz
  10. // celostevilskih nakljucnih stevil
  11. Random generator = new Random();
  12. List rezultat = new ArrayList();
  13. for(int i=0; i < velikostNiza; ++i) {
  14. rezultat.add(new Integer(generator.nextInt(zgMeja)));
  15. }
  16. return rezultat;
  17. }
Osebna orodja