Juhusliku numbri genereerimine Java
⚡ Nutikas kokkuvõte
Juhuslikud arvud Java pärinevad neljast omavahel seotud standardse teegi valikust: Random klass, Math.random, ThreadLocalRandom ja SecureRandom, millest igaüks hõlmab reaalsete rakenduste jaoks erinevat kiiruse, lõime turvalisuse ja krüptograafilise tugevuse kombinatsiooni.
Juhuslikud numbrid ilmuvad kõikjal Javaalates ühiktestimise andmetest ja täringuveeretamise mängudest kuni seansimärkide ja segatud kaardipakkideni. See õpetus selgitab, kuidas genereerida juhuslikke numbreid Java standardteegi kõigi valikute kasutamine ja õige valimine.
Loo juhuslik arv sisse Java
. Java Standardraamatukogu pakub nelja levinud viisi juhusliku arvu genereerimiseks:
java.util.Randomon üldotstarbeline klass. See genereerib tõeväärtusi, täisarv-, pikk-, float- ja topeltväärtusi selliste meetodite abil nagunextInt,nextLongjanextDouble.Math.randomon staatiline abimees, mis tagastab jagatudRandomsisemiselt.ThreadLocalRandominjava.util.concurrentannab igale lõimele oma generaatori, nii et mitu lõime ei konkureeri ühel eksemplaril.SecureRandominjava.securitygenereerib paroolide, seansi identifikaatorite ja võtmete jaoks krüptograafiliselt tugevaid pseudojuhuslikke numbreid.
Allolevad jaotised näitavad, kuidas iga lähenemisviisiga genereerida kümme juhuslikku arvu.
Näide: looge juhuslik arv, kasutades Java Juhuslik klass
Esimeses näites kasutatakse java.util.Random et saada kümme täisarvu vahemikus 0 kuni 99 (kaasa arvatud):
import java.util.Random; public class RandomNumbers { public static void main(String[] args) { Random objGenerator = new Random(); for (int iCount = 0; iCount < 10; iCount++) { int randomNumber = objGenerator.nextInt(100); System.out.println("Random No : " + randomNumber); } } }
Väljund:
Random No : 17 Random No : 57 Random No : 73 Random No : 48 Random No : 68 Random No : 86 Random No : 34 Random No : 97 Random No : 73 Random No : 18
Näide sellest Random on loodud kui objGenerator. nextInt(int bound) meetod tagastab väärtuse vahemikus 0 (kaasa arvatud) kuni antud piirini (välja arvatud), seega nextInt(100) annab väärtused vahemikus 0 kuni 99. Järjestuse reprodutseeritavaks muutmiseks edastage konstruktorile seeme, näiteks new Random(42); sama seeme annab alati sama järjestuse, mis on kasulik testides ja simulatsioonides.
Näide: kasutamine Java Math.juhuslik
Kümne juhusliku väärtuse genereerimiseks vahemikus 0.0 kuni 1.0 kutsuge staatilisi Math.random meetod sees silmusSee on kiireim viis juhusliku topeltväärtuse saamiseks ilma generaatorobjekti loomata:
public class DemoRandom { public static void main(String[] args) { for (int xCount = 0; xCount < 10; xCount++) { System.out.println(Math.random()); } } }
Väljund:
0.46518450373334297 0.14859851177803485 0.5628391820492477 0.6323378498048606 0.1740198445692248 0.9140544122258946 0.9167350036262347 0.49251219841030147 0.7426056725722353 0.2039418871298877
Kapoti all, Math.random loob ühe staatilise elemendi Random esmakordsel kasutamisel ja kõnede ajal nextDouble sellel. See üks jagatud generaator sobib demode jaoks hästi, aga suure mitmelõimelise koormuse korral muutub see pudelikaelaks, mida käsitletakse järgmistes osades.
Juhusliku arvu genereerimine kohandatud vahemikus
Reaalsed programmid vajavad tavaliselt juhuslikku väärtust kindlas vahemikus, näiteks täisarvu 1 ja 6 vahel täringuviske jaoks või topeltarvu 10.0 ja 20.0 vahel simulatsiooni jaoks. Kaks mustrit katavad peaaegu iga juhtumi.
Juhuslik täisarv min ja max vahel (kaasa arvatud):
import java.util.Random; public class RangeDemo { public static void main(String[] args) { Random rnd = new Random(); int min = 1; int max = 6; // nextInt(max - min + 1) returns 0..(max-min), then shift by min int dice = rnd.nextInt(max - min + 1) + min; System.out.println("Dice roll : " + dice); } }
Juhuslik topelt miinimumi ja maksimumi vahel:
double min = 10.0; double max = 20.0; double value = min + (max - min) * Math.random(); System.out.println("Value : " + value);
Mõlemad mustrid toimivad nii, et võtavad generaatori algupärasest vahemikust väärtuse, skaleerivad selle sihtvahemiku laiusele ja nihutavad seda miinimumi võrra ülespoole. Kui olete sisse lülitatud Java 8 või uuema versiooni puhul on sama tulemus saadaval ka uuema versiooni kaudu. ints, longsja doubles voogedastuse meetodid on sisse lülitatud RandomNäiteks rnd.ints(10, 1, 7).forEach(System.out::println) kümne täringuviske puhul.
ThreadLocalRandom mitmelõimelise jaoks Code
Üks jagatud Random on lõimekindel, kuid konkurentsi korral aeglane, kuna iga lõim peab sünkroonima sama sisemise seemnega. ThreadLocalRandom, lisatud sisse Java 7 ja elab seal java.util.concurrent, annab igale lõimele oma generaatori, nii et lukustuskonkurentsi ei teki.
import java.util.concurrent.ThreadLocalRandom; public class ThreadLocalDemo { public static void main(String[] args) { // random int in [1, 100] int i = ThreadLocalRandom.current().nextInt(1, 101); // random long in [1000, 5000] long l = ThreadLocalRandom.current().nextLong(1000L, 5001L); // random double in [0.0, 1.0) double d = ThreadLocalRandom.current().nextDouble(); System.out.println(i + " " + l + " " + d); } }
Kasutama ThreadLocalRandom.current() töölõimede, paralleelsete voogude ja mis tahes samaaegsete ülesannete sees. Pange tähele, et setSeed viskab UnsupportedOperationException, seega reprodutseeritavuse külvi ei toetata; kui vajate fikseeritud külvi, kasutage tavalist Random.
SecureRandom turvatundliku juhusliku valiku jaoks Numbers
Juhtumid Random ja ThreadLocalRandom ei ole krüptograafiliselt turvalised. Mõne väljundnäidise põhjal saab ründaja sisemise oleku taastada ja tulevasi väärtusi ennustada. Paroolide, seansimärkide, soolaväärtuste ja krüptograafiliste võtmete jaoks kasutage java.security.SecureRandom Selle asemel ammutab see operatsioonisüsteemi entroopiavarust algmaterjali ja annab väärtusi, mida on võimatu ennustada.
import java.security.SecureRandom; public class SecureDemo { public static void main(String[] args) { SecureRandom secure = new SecureRandom(); byte[] token = new byte[16]; secure.nextBytes(token); // 128-bit random token int otp = secure.nextInt(1_000_000); // 6-digit one-time code System.out.println("OTP : " + String.format("%06d", otp)); } }
SecureRandom on aeglasem kui Random sest see kasutab tugevamaid algoritme ja rikkalikumat algmaterjali. Jätke see alles turvatöödeks ja kasutage kiiremaid generaatoreid mängude, simulatsioonide ja testandmete jaoks.

