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รค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 somnextInt,nextLongochnextDouble.Math.randomรคr en statisk hjรคlpare som returnerar en dubbel mellan 0.0 (inklusive) och 1.0 (exklusive) med hjรคlp av en deladRandominternt.ThreadLocalRandominjava.util.concurrentger varje trรฅd sin egen generator, sรฅ flera trรฅdar konkurrerar inte om en enda instans.SecureRandominjava.securityproducerar 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.
