{"id":212,"date":"2024-02-16T01:06:32","date_gmt":"2024-02-16T00:06:32","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=212"},"modified":"2024-02-21T01:09:00","modified_gmt":"2024-02-21T00:09:00","slug":"die-erzeugung-von-zufallszahlen-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=212","title":{"rendered":"Die Erzeugung von Zufallszahlen in Java"},"content":{"rendered":"\n<p>Die Generierung von Zufallszahlen ist in der Softwareentwicklung eine h\u00e4ufige Anforderung, sei es f\u00fcr Simulationen, Spiele oder Verschl\u00fcsselung. In der Java-Programmiersprache gibt es verschiedene Mechanismen und Klassen, um Zufallszahlen zu erzeugen. In diesem Artikel werfen wir einen eingehenden Blick auf einige der wichtigsten Methoden: <code>java.lang.Math<\/code>, <code>java.util.Random<\/code>, <code>java.util.concurrent.ThreadLocalRandom<\/code>, <code>java.util.SplittableRandom<\/code> und <code>java.security.SecureRandom<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Grundlagen: java.lang.Math<\/h2>\n\n\n\n<p>Java bietet bereits in der Standardbibliothek die Klasse <code>java.lang.Math<\/code>, die verschiedene mathematische Funktionen bereitstellt. Allerdings sollte beachtet werden, dass die Methoden in dieser Klasse nicht f\u00fcr die Erzeugung von Zufallszahlen gedacht sind. Die Methoden, wie <code>random()<\/code>, liefern pseudozuf\u00e4llige Gleitkommazahlen zwischen 0 (inklusive) und 1 (exklusive). Es ist wichtig zu verstehen, dass diese Zahlen nicht wirklich zuf\u00e4llig sind, sondern auf einem Algorithmus basieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">double randomNum = <span class=\"hljs-built_in\">Math<\/span>.random();\nSystem.out.println(<span class=\"hljs-string\">\"Zufallszahl mit Math.random(): \"<\/span> + randomNum);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Es gibt jedoch einige Nachteile bei der Verwendung von <code>Math.random()<\/code>. Die zur\u00fcckgegebenen Werte sind immer vom Typ <code>double<\/code>, und es gibt keine M\u00f6glichkeit, den Bereich der erzeugten Zahlen anzupassen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Klassiker: java.util.Random<\/h2>\n\n\n\n<p>Die Klasse <code>java.util.Random<\/code> bietet eine umfassendere M\u00f6glichkeit zur Generierung von Zufallszahlen. Diese Klasse verwendet einen linearen kongruenten Generator und erm\u00f6glicht die Erzeugung von Zufallszahlen unterschiedlicher Typen und Bereiche.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Random random = <span class=\"hljs-keyword\">new<\/span> Random();\nint randomNumber = random.nextInt(<span class=\"hljs-number\">100<\/span>); <span class=\"hljs-comment\">\/\/ Zufallszahl zwischen 0 (inklusive) und 100 (exklusive)<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Zufallszahl mit Random.nextInt(): \"<\/span> + randomNumber);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird eine Zufallszahl im Intervall [0, 100) erzeugt. Durch Verwendung verschiedener Methoden wie <code>nextLong()<\/code>, <code>nextFloat()<\/code> und <code>nextDouble()<\/code> k\u00f6nnen Zufallszahlen unterschiedlicher Typen generiert werden.<\/p>\n\n\n\n<p>Ein interessantes Merkmal der <code>Random<\/code>-Klasse ist die M\u00f6glichkeit, den Generierungsalgorithmus zu setzen, indem man einen sogenannten &#8222;Seed&#8220; angibt. Ein Seed ist eine Startzahl f\u00fcr den Generator, die die gesamte Sequenz von Zufallszahlen bestimmt. Wenn zwei <code>Random<\/code>-Objekte denselben Seed haben, erzeugen sie dieselbe Sequenz von Zufallszahlen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Random seededRandom = <span class=\"hljs-keyword\">new<\/span> Random(<span class=\"hljs-number\">42<\/span>); <span class=\"hljs-comment\">\/\/ Seed ist hier 42<\/span>\nint randomWithSeed = seededRandom.nextInt();\nSystem.out.println(<span class=\"hljs-string\">\"Zufallszahl mit festem Seed: \"<\/span> + randomWithSeed);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Die Thread-sichere Variante: java.util.concurrent.ThreadLocalRandom<\/h2>\n\n\n\n<p>In multithreaded Umgebungen kann die Verwendung von <code>java.util.Random<\/code> zu Wettlaufsituationen f\u00fchren, da sie nicht thread-sicher ist. Um dies zu vermeiden, wurde <code>java.util.concurrent.ThreadLocalRandom<\/code> eingef\u00fchrt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">int randomInt = ThreadLocalRandom.current().nextInt(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">20<\/span>); <span class=\"hljs-comment\">\/\/ Zufallszahl zwischen 10 (inklusive) und 20 (exklusive)<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Thread-sichere Zufallszahl: \"<\/span> + randomInt);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>ThreadLocalRandom<\/code> ist auf die Verwendung in parallelen Programmen optimiert und bietet somit eine effiziente M\u00f6glichkeit, Zufallszahlen in Threads zu generieren, ohne aufwendige Synchronisationsmechanismen implementieren zu m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der moderne Ansatz: java.util.SplittableRandom<\/h2>\n\n\n\n<p>Ab Java 8 steht uns <code>java.util.SplittableRandom<\/code> zur Verf\u00fcgung, das auf dem Konzept der &#8222;splittable&#8220; Generatoren basiert. Diese Generatoren erm\u00f6glichen das einfache Teilen und Erzeugen neuer Generatoren, was in parallelen Algorithmen besonders n\u00fctzlich ist.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SplittableRandom splittableRandom = <span class=\"hljs-keyword\">new<\/span> SplittableRandom();\ndouble randomDouble = splittableRandom.nextDouble(); <span class=\"hljs-comment\">\/\/ Zufalls-Gleitkommazahl zwischen 0 (inklusive) und 1 (exklusive)<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Zufallszahl mit SplittableRandom.nextDouble(): \"<\/span> + randomDouble);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ein bedeutender Vorteil von <code>SplittableRandom<\/code> ist, dass er eine Methode <code>split()<\/code> bereitstellt, um einen neuen Generator basierend auf seinem internen Zustand zu erstellen. Dies erleichtert die Erzeugung von Zufallszahlen in parallel arbeitenden Threads.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SplittableRandom parentRandom = <span class=\"hljs-keyword\">new<\/span> SplittableRandom();\nSplittableRandom childRandom = parentRandom.split();\ndouble childRandomDouble = childRandom.nextDouble();\nSystem.out.println(<span class=\"hljs-string\">\"Zufallszahl aus einem gesplitteten Generator: \"<\/span> + childRandomDouble);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Die sichere Alternative: java.security.SecureRandom<\/h2>\n\n\n\n<p>F\u00fcr sicherheitskritische Anwendungen, wie Verschl\u00fcsselung oder sichere Kommunikation, ist die Klasse <code>java.security.SecureRandom<\/code> die richtige Wahl. Im Gegensatz zu den zuvor genannten Klassen versucht <code>SecureRandom<\/code> h\u00f6chste Sicherheitsstandards zu erf\u00fcllen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SecureRandom secureRandom = <span class=\"hljs-keyword\">new<\/span> SecureRandom();\nbyte&#91;] randomBytes = <span class=\"hljs-keyword\">new<\/span> byte&#91;<span class=\"hljs-number\">16<\/span>];\nsecureRandom.nextBytes(randomBytes);\nSystem.out.println(<span class=\"hljs-string\">\"Sichere Zufallsbytes: \"<\/span> + Arrays.toString(randomBytes));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>SecureRandom<\/code> verwendet hochwertige Entropiequellen, um die Sicherheit der generierten Zufallszahlen zu gew\u00e4hrleisten. Es ist jedoch zu beachten, dass dies auf Kosten der Leistung gehen kann, da sicherheitsrelevante Berechnungen zeitaufw\u00e4ndiger sind als einfache pseudozuf\u00e4llige Generatoren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Die Java-Plattform bietet eine Vielzahl von M\u00f6glichkeiten zur Erzeugung von Zufallszahlen, je nach den Anforderungen Ihrer Anwendung. Von einfachen Pseudozufallszahlen mit <code>Math.random()<\/code> bis hin zu sicheren Zufallszahlen mit <code>SecureRandom<\/code> gibt es eine breite Palette von Optionen. Bei der Auswahl eines Zufallszahlengenerators ist es wichtig, die Anforderungen Ihrer Anwendung zu ber\u00fccksichtigen, einschlie\u00dflich Leistung, Thread-Sicherheit und Sicherheit. Mit den vorgestellten Klassen k\u00f6nnen Sie sicherstellen, dass Sie die richtige Methode f\u00fcr Ihr spezifisches Szenario ausw\u00e4hlen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Generierung von Zufallszahlen ist in der Softwareentwicklung eine h\u00e4ufige Anforderung, sei es f\u00fcr Simulationen, Spiele oder Verschl\u00fcsselung. In der Java-Programmiersprache gibt es verschiedene Mechanismen und Klassen, um Zufallszahlen zu erzeugen. In diesem Artikel werfen wir einen eingehenden Blick auf einige der wichtigsten Methoden: java.lang.Math, java.util.Random, java.util.concurrent.ThreadLocalRandom, java.util.SplittableRandom und java.security.SecureRandom. Die Grundlagen: java.lang.Math Java bietet [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-212","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=212"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/212\/revisions"}],"predecessor-version":[{"id":213,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/212\/revisions\/213"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}