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.

  • 🎲 Juhuslik klass: java.util.Random paljastab nextInt, nextLong ja next väärtusedDoubleja nextBoolean tavaliste primitiivsete tüüpide jaoks.
  • 🧮 Math.random: Funktsioon Math.random tagastab jagatud juhusliku eksemplari abil topeltväärtuse vahemikus 0.0 (kaasa arvatud) kuni 1.0 (välja arvatud).
  • 🎯 Kohandatud vahemikud: Andke nextInt-ile piirang või skaleerige Math.random, et genereerida väärtusi mis tahes miinimumi ja maksimumi piires.
  • 🧵 Keerme ohutus: Java.util.concurrent failis olev ThreadLocalRandom annab igale lõimele oma generaatori ja ületab jagatud Randomi konkurentsi korral.
  • 🔐 Turvalisus: java.security funktsioon SecureRandom loob paroolide, tokenite ja seansivõtmete jaoks krüptograafiliselt tugevaid väärtusi.
  • 🌱 Reprodutseeritavus: Juhusliku väärtuse külvamine fikseeritud pika väärtusega muudab testid ja simulatsioonid deterministlikuks kõigi testide puhul.

Juhusliku numbri genereerimine Java

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.Random on üldotstarbeline klass. See genereerib tõeväärtusi, täisarv-, pikk-, float- ja topeltväärtusi selliste meetodite abil nagu nextInt, nextLongja nextDouble.
  • Math.random on staatiline abimees, mis tagastab jagatud Random sisemiselt.
  • ThreadLocalRandom in java.util.concurrent annab igale lõimele oma generaatori, nii et mitu lõime ei konkureeri ühel eksemplaril.
  • SecureRandom in java.security genereerib 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.

KKK

Loo java.util.Random eksemplar ja kutsu välja nextInt, nextLong ja next.Doublevõi nextBoolean. Kiire üherealise vastuse jaoks kasutage funktsiooni Math.random, mis tagastab topeltarvu vahemikus 0.0 kuni 1.0. Mõlemad lähenemisviisid on standardteegiga kaasas.

Täisarvude jaoks kutsu välja random.nextInt(max – min + 1) + min või kahekordsete arvude jaoks min + (max – min) * Math.random(). Valemid skaleerivad generaatori vahemiku teie sihtaknale ja nihutavad seda minimaalse väärtuse võrra.

Random on täisklass, mis sisaldab meetodeid paljude primitiivtüüpide jaoks ja toetab külvi. Math.random on staatiline abiklass, mis tagastab topeltväärtuse vahemikus 0.0 kuni 1.0. Sisemiselt kutsub Math.random välja ühe jagatud Random eksemplari.

Jah, aga samaaegsed kõned võistlevad sama sisemise seemne pärast, mis aeglustab tugevalt lõimitud koodi. Kasutage java.util.concurrent faili ThreadLocalRandom.current() funktsiooni, et anda igale lõimele oma generaator ja see võistlus eemaldada.

Edastage Random konstruktorile fikseeritud pikk väärtus, näiteks new Random(42), või kutsuge välja setSeed(42). Generaator genereerib iga käivituse korral sama jada, mis on oluline korduvate testide ja simulatsioonide jaoks.

Kasutage SecureRandom funktsiooni alati, kui väärtus peab vastu pidama ennustamisele, näiteks paroolide, seansi tunnuste, soolaväärtuste, ühekordsete koodide ja krüptograafiliste võtmete puhul. Plain Random on kiire, kuid ennustatav, seega pole see turvatööde jaoks ohtlik.

Masinõppe raamistikud kasutavad kaalude initsialiseerimiseks, treeningandmete segamiseks ja valideerimiskogumite jagamiseks pseudojuhuslikke generaatoreid. Lähteväärtuse fikseerimine muudab katsed reprodutseeritavaks, et meeskonnad saaksid mudeli käivitamisi usaldusväärselt võrrelda ja tulemusi siluda.

Jah. GitHub Copilot toetab Random, ThreadLocalRandom ja SecureRandom koodijuppe, sobitades vahemiku skaleerimise valemeid ja JUnit testid. RevVaadake iga soovitust, et veenduda valitud klassi sobivuses kasutusjuhtumiga, eriti turvatundliku koodi puhul.

Võta see postitus kokku järgmiselt: