Eine generische Methode, die eine zufällige Ganzzahl zwischen zwei Parametern zurückgeben kann, wie es Ruby tut rand(0..n)
.
Irgendein Vorschlag?
Mein Vorschlag wäre eine Erweiterungsfunktion in IntRange , um solche Zufälle zu erstellen:(0..10).random()
Ab 1.3 verfügt Kotlin über einen eigenen plattformübergreifenden Zufallsgenerator. Es wird in diesem KEEP beschrieben . Die unten beschriebene Erweiterung ist jetzt Teil der Kotlin-Standardbibliothek. Verwenden Sie sie einfach folgendermaßen:
val rnds = (0..10).random()
Vor 1.3 verwenden wir auf der JVM Random
oder auch ThreadLocalRandom
wenn wir auf JDK> 1.6 sind.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
So verwendet:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Wenn Sie möchten, dass die Funktion nur zurückgegeben wird 1, 2, ..., 9
( 10
nicht enthalten), verwenden Sie einen Bereich mit until
:
(0 until 10).random()
Wenn Sie mit JDK> 1.6 arbeiten, verwenden Sie ThreadLocalRandom.current()
anstelle von Random()
.
KotlinJs und andere Variationen
Informationen zu Kotlinjs und anderen Anwendungsfällen, deren Verwendung nicht zulässig ist java.util.Random
, finden Sie in dieser Alternative .
In dieser Antwort finden Sie auch Variationen meines Vorschlags. Es enthält auch eine Erweiterungsfunktion für zufällige Char
s.
java.util.Random
?Generieren Sie eine zufällige Ganzzahl zwischen
from
(einschließlich) undto
(exklusiv)quelle
Int
Zufälle erhalten möchten , können Sie stattdessen Random # int (Größe, von, bis) in Java-8 verwenden .Ab Kotlin 1.2 können Sie schreiben:
(1..3).shuffled().last()
Seien Sie sich nur bewusst, dass es ein großes O (n) ist, aber für eine kleine Liste (insbesondere mit eindeutigen Werten) ist es in Ordnung: D.
quelle
Sie können eine Erweiterungsfunktion erstellen
java.util.Random.nextInt(int)
, dieIntRange
derInt
für ihre Bindung ähnlich ist, jedoch eine anstelle einer :Sie können dies jetzt mit jeder
Random
Instanz verwenden:Wenn Sie keine eigene
Random
Instanz verwalten müssen, können Sie eine praktische Methode definieren, indem Sie beispielsweise Folgendes verwendenThreadLocalRandom.current()
:Jetzt können Sie wie in Ruby eine zufällige Ganzzahl erhalten, ohne zuvor selbst eine
Random
Instanz deklarieren zu müssen :quelle
Mögliche Variation zu meiner anderen Antwort für zufällige Zeichen
Um zufällige
Char
s zu erhalten, können Sie eine Erweiterungsfunktion wie diese definierenWenn Sie mit JDK> 1.6 arbeiten, verwenden Sie
ThreadLocalRandom.current()
anstelle vonRandom()
.Für Kotlinjs und andere Anwendungsfälle, deren Verwendung nicht zulässig ist
java.util.Random
, hilft diese Antwort .Kotlin> = 1.3 Multiplattform-Unterstützung für Random
Ab 1.3 verfügt Kotlin über einen eigenen Multiplattform-Zufallsgenerator. Es wird in diesem KEEP beschrieben . Sie können die Erweiterung jetzt direkt als Teil der Kotlin-Standardbibliothek verwenden, ohne sie zu definieren:
quelle
Aufbauend auf @ s1m0nw1 ausgezeichnete Antwort Ich habe die folgenden Änderungen vorgenommen.
Code:
Testfall:
quelle
Beispiele zufällig im Bereich [1, 10]
oder mit Java Random
quelle
Kotlin> = 1.3, Multiplattform-Unterstützung für Random
Ab 1.3 bietet die Standardbibliothek Unterstützung für mehrere Plattformen, siehe diese Antwort.
Kotlin <1.3 auf JavaScript
Wenn Sie mit Kotlin JavaScript arbeiten und keinen Zugriff darauf haben
java.util.Random
, funktioniert Folgendes:So verwendet:
quelle
Eine andere Möglichkeit, die Antwort von s1m0nw1 zu implementieren, besteht darin, über eine Variable darauf zuzugreifen. Nicht, dass es effizienter wäre, aber es erspart Ihnen die Eingabe von ().
Und jetzt kann als solches darauf zugegriffen werden
quelle
Es gibt keine Standardmethode, die dies tut, aber Sie können ganz einfach Ihre eigene Methode entweder mit
Math.random()
oder mit der Klasse erstellenjava.util.Random
. Hier ist ein Beispiel mit derMath.random()
Methode:Dies ist eine Beispielausgabe:
quelle
Die Kotlin-Standardbibliothek bietet keine Zufallszahlengenerator-API. Wenn Sie nicht in einem Multiplattform-Projekt sind, ist es besser, die Plattform-API zu verwenden (alle anderen Antworten auf die Frage sprechen von dieser Lösung) .
Wenn Sie sich jedoch in einem Multiplattform-Kontext befinden, besteht die beste Lösung darin, Random selbst in reinem Kotlin zu implementieren, um denselben Zufallszahlengenerator zwischen Plattformen zu teilen. Es ist einfacher für Entwickler und Tests.
Um dieses Problem in meinem persönlichen Projekt zu beantworten, implementiere ich einen reinen Kotlin Linear Congruential Generator . LCG ist der von
java.util.Random
. Folgen Sie diesem Link, wenn Sie ihn verwenden möchten: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Mein Implementierungszweck
nextInt(range: IntRange)
für Sie;).Achten Sie auf meinen Zweck. LCG eignet sich für die meisten Anwendungsfälle (Simulation, Spiele usw.) , ist jedoch aufgrund der Vorhersagbarkeit dieser Methode nicht für die kryptografische Verwendung geeignet.
quelle
In Kotlin 1.3 können Sie es so machen
quelle
Wenn die Nummern, aus denen Sie auswählen möchten, nicht fortlaufend sind, können Sie sie verwenden
random()
.Verwendung:
Gibt eine der Nummern zurück, die in der Liste enthalten sind.
quelle
Sie müssen keine benutzerdefinierten Erweiterungsfunktionen mehr verwenden. IntRange verfügt jetzt über eine sofort einsatzbereite
random()
Erweiterungsfunktion.quelle
Mit einer Funktion der obersten Ebene können Sie genau die gleiche Aufrufsyntax wie in Ruby erzielen (wie Sie möchten):
Verwendung:
quelle
Zunächst benötigen Sie ein RNG. In Kotlin müssen Sie derzeit die plattformspezifischen verwenden (es ist kein Kotlin in einem integriert). Für die JVM ist es
java.util.Random
. Sie müssen eine Instanz davon erstellen und dann aufrufenrandom.nextInt(n)
.quelle
Hoffe das hilft.
quelle
Sie können eine Erweiterungsfunktion erstellen:
Round Float-Wert:
Verwendung der Methode:
Ausgabe:
quelle
Vollständiger Quellcode. Kann steuern, ob Duplikate zulässig sind.
quelle
Wann immer es eine Situation gibt, in der Sie eine Schlüssel- oder Mac-Adresse generieren möchten, bei der es sich um eine hexadezimale Zahl mit Ziffern handelt, die auf der Benutzeranforderung basieren, und dies auch unter Verwendung von Android und Kotlin, hilft Ihnen mein unten stehender Code:
quelle
super duper sein))
quelle