Hur man genererar slumptal i Java

โšก Smart sammanfattning

Slumpmรคssiga tal i Java kommer frรฅn fyra relaterade standardbiblioteksalternativ, Random-klassen, Math.random, ThreadLocalRandom och SecureRandom, som var och en tรคcker en annan blandning av hastighet, trรฅdsรคkerhet och kryptografisk styrka fรถr verkliga tillรคmpningar.

  • ๐ŸŽฒ Slumpmรคssig klass: java.util.Random exponerar nextInt, nextLong, nextDouble, och nextBoolean fรถr vanliga primitiva typer.
  • ๐Ÿงฎ Math.random: Math.random returnerar en dubbel mellan 0.0 inklusive och 1.0 exklusive med hjรคlp av en delad Random-instans.
  • ๐ŸŽฏ Anpassade intervall: Skicka en grรคns till nextInt eller skala Math.random fรถr att generera vรคrden inom valfritt minimum och maximum.
  • ๐Ÿงต Trรฅdsรคkerhet: ThreadLocalRandom i java.util.concurrent ger varje trรฅd sin egen generator och รถvertrรคffar en delad Random under konkurrens.
  • ๐Ÿ” Sรคkerhet: SecureRandom i java.security producerar kryptografiskt starka vรคrden fรถr lรถsenord, tokens och sessionsnycklar.
  • ???? reproducerbarhet: Att seedning av en slumpmรคssig vรคrde med en fast long gรถr tester och simuleringar deterministiska รถver kรถrningar.

Hur man genererar slumptal i Java

Slumpmรคssiga tal dyker upp รถverallt Java, frรฅn enhetstestdata och tรคrningskastspel till sessionsmarker och blandade kortlekar. Den hรคr handledningen fรถrklarar hur man genererar slumptal i Java anvรคnda alla alternativ i standardbiblioteket och hur man vรคljer rรคtt fรถr jobbet.

Generera slumptal i Java

Ocuco-landskapet Java Standardbiblioteket erbjuder fyra vanliga sรคtt att generera ett slumptal:

  • java.util.Random รคr den generella klassen. Den producerar booleska, int-, long-, float- och double-vรคrden genom metoder som nextInt, nextLongoch nextDouble.
  • Math.random รคr en statisk hjรคlpare som returnerar en dubbel mellan 0.0 (inklusive) och 1.0 (exklusive) med hjรคlp av en delad Random internt.
  • ThreadLocalRandom in java.util.concurrent ger varje trรฅd sin egen generator, sรฅ flera trรฅdar konkurrerar inte om en enda instans.
  • SecureRandom in java.security producerar kryptografiskt starka pseudoslumptal fรถr lรถsenord, sessionsidentifierare och nycklar.

Avsnitten nedan visar hur man genererar tio slumptal med varje metod.

Exempel: Generera slumptal med hjรคlp av Java Slumpmรคssig klass

Det fรถrsta exemplet anvรคnder java.util.Random fรถr att producera tio heltal i intervallet 0 till och med 99:

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

Produktion:

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

Ett exempel pรฅ Random skapas som objGenerator. De nextInt(int bound) Metoden returnerar ett vรคrde mellan 0 (inklusive) och den angivna grรคnsen (exklusive), sรฅ nextInt(100) ger vรคrden frรฅn 0 till 99. Fรถr att gรถra sekvensen reproducerbar, skicka ett frรถ till konstruktorn, till exempel new Random(42); samma frรถ producerar alltid samma sekvens, vilket รคr anvรคndbart i tester och simuleringar.

Exempel: Anvรคnda Java Matematik.slumpmรคssig

Fรถr att generera tio slumpmรคssiga vรคrden i intervallet 0.0 till 1.0, anropa den statiska Math.random metod inuti en slingaDetta รคr det snabbaste sรคttet att fรฅ en slumpmรคssig dubbel utan att skapa ett generatorobjekt:

public class DemoRandom {
    public static void main(String[] args) {
        for (int xCount = 0; xCount < 10; xCount++) {
            System.out.println(Math.random());
        }
    }
}

Produktion:

0.46518450373334297
0.14859851177803485
0.5628391820492477
0.6323378498048606
0.1740198445692248
0.9140544122258946
0.9167350036262347
0.49251219841030147
0.7426056725722353
0.2039418871298877

Under huven, Math.random skapar en enda statisk Random vid fรถrsta anvรคndningen och samtal nextDouble pรฅ den. Den dรคr delade generatorn fungerar bra fรถr demonstrationer men blir en flaskhals under hรถg flertrรฅdad belastning, vilket nรคsta avsnitt tar upp.

Generera ett slumptal i ett anpassat omrรฅde

Verkliga program behรถver vanligtvis ett slumpmรคssigt vรคrde inom ett specifikt intervall, sรฅsom ett heltal mellan 1 och 6 fรถr ett tรคrningskast eller en dubbel mellan 10.0 och 20.0 fรถr en simulering. Tvรฅ mรถnster tรคcker nรคstan varje fall.

Slumpmรคssigt heltal mellan min och max (inklusive):

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

Slumpmรคssig dubbel mellan min och max:

double min = 10.0;
double max = 20.0;
double value = min + (max - min) * Math.random();
System.out.println("Value : " + value);

Bรฅda mรถnstren fungerar genom att ta ett vรคrde frรฅn generatorns ursprungliga omrรฅde, skala det till mรฅlomrรฅdets bredd och flytta upp det med minimum. Om du รคr pรฅ Java 8 eller senare, samma resultat รคr tillgรคngligt via den nyare ints, longsoch doubles strรถmningsmetoder pรฅ Random, till exempel rnd.ints(10, 1, 7).forEach(System.out::println) fรถr tio tรคrningskast.

ThreadLocalRandom fรถr flertrรฅdad Code

En enda delad Random รคr trรฅdsรคker men lรฅngsam under konkurrens eftersom varje trรฅd mรฅste synkroniseras pรฅ samma interna frรถ. ThreadLocalRandom, lagt till Java 7 och bor i java.util.concurrent, ger varje trรฅd sin egen generator sรฅ att det inte uppstรฅr nรฅgon lรฅskonflikt.

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

Anvรคnda ThreadLocalRandom.current() inuti arbetstrรฅdar, parallella strรถmmar och alla samtidiga uppgifter. Observera att setSeed kastar UnsupportedOperationException, sรฅ sรฅdd fรถr reproducerbarhet stรถds inte; om du behรถver ett fast frรถ, hรฅll dig till vanligt Random.

SecureRandom fรถr sรคkerhetskรคnsliga slumpmรคssiga Numbers

Fall av Random och ThreadLocalRandom รคr inte kryptografiskt sรคkra. Med ett fรฅtal utdataexempel kan en angripare rekonstruera det interna tillstรฅndet och fรถrutsรคga framtida vรคrden. Fรถr lรถsenord, sessionstokens, saltvรคrden och kryptografiska nycklar, anvรคnd java.security.SecureRandom istรคllet. Den hรคmtar frรถmaterial frรฅn operativsystemets entropipool och producerar vรคrden som motstรฅr fรถrutsรคgelser.

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 รคr lรฅngsammare รคn Random eftersom den anvรคnder starkare algoritmer och rikare frรถmaterial. Reservera det fรถr sรคkerhetsarbete och anvรคnd de snabbare generatorerna fรถr spel, simuleringar och testdata.

Vanliga frรฅgor

Skapa en java.util.Random-instans och anropa nextInt, nextLong, nextDouble, eller nextBoolean. Fรถr en snabb sammanfattning, anvรคnd Math.random som returnerar ett dubbelvรคrde mellan 0.0 och 1.0. Bรฅda metoderna levereras med standardbiblioteket.

Anropa random.nextInt(max โ€“ min + 1) + min fรถr heltal, eller min + (max โ€“ min) * Math.random() fรถr dubbletter. Formlerna skalar generatorns intervall till ditt mรฅlfรถnster och fรถrskjuts med minimivรคrdet.

Random รคr en komplett klass med metoder fรถr mรฅnga primitiva typer och stรถder seeding. Math.random รคr en statisk hjรคlpare som returnerar en double mellan 0.0 och 1.0. Internt anropar Math.random en enda delad Random-instans.

Ja, men samtidiga anrop konkurrerar med samma interna seed, vilket saktar ner kod med hรถg trรฅdning. Anvรคnd ThreadLocalRandom.current() frรฅn java.util.concurrent fรถr att ge varje trรฅd en egen generator och ta bort den konflikten.

Skicka ett fast long-vรคrde till Random-konstruktorn, till exempel new Random(42), eller anropa setSeed(42). Generatorn kommer att producera samma sekvens varje kรถrning, vilket รคr viktigt fรถr repeterbara tester och simuleringar.

Anvรคnd SecureRandom nรคrhelst vรคrdet mรฅste motstรฅ fรถrutsรคgelse, till exempel lรถsenord, sessionstokens, saltvรคrden, engรฅngskoder och kryptografiska nycklar. Plain Random รคr snabbt men fรถrutsรคgbart, sรฅ det รคr osรคkert fรถr sรคkerhetsarbete.

Maskininlรคrningsramverk anvรคnder pseudo-slumpmรคssiga generatorer fรถr att initiera vikter, blanda trรคningsdata och dela valideringsmรคngder. Att fixa ett frรถ gรถr experiment reproducerbara sรฅ att team kan jรคmfรถra modellkรถrningar och felsรถka resultat pรฅ ett tillfรถrlitligt sรคtt.

Ja. GitHub Copilot anvรคnder Random-, ThreadLocalRandom- och SecureRandom-kodavsnitt, matchande formler fรถr skalning av intervall och JUnit tester. RevVisa varje fรถrslag fรถr att bekrรคfta att den valda klassen passar anvรคndningsfallet, sรคrskilt fรถr sรคkerhetskรคnslig kod.

Sammanfatta detta inlรคgg med: