Une méthode générique qui peut renvoyer un entier aléatoire entre 2 paramètres comme le fait ruby avec rand(0..n)
.
Toute suggestion?
Ma suggestion serait une fonction d' extension sur IntRange pour créer des aléas comme ceci:(0..10).random()
Depuis la version 1.3, Kotlin est livré avec son propre générateur aléatoire multi-plateforme. Il est décrit dans ce KEEP . L'extension décrite ci-dessous fait maintenant partie de la bibliothèque standard Kotlin , utilisez-la simplement comme ceci:
val rnds = (0..10).random()
Avant 1.3, sur la JVM on utilise Random
ou même ThreadLocalRandom
si on est sur JDK> 1.6.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
Utilisé comme ceci:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Si vous souhaitez que la fonction renvoie uniquement 1, 2, ..., 9
( 10
non incluse), utilisez une plage construite avec until
:
(0 until 10).random()
Si vous travaillez avec JDK> 1.6, utilisez à la ThreadLocalRandom.current()
place de Random()
.
KotlinJs et autres variantes
Pour les kotlinjs et autres cas d'utilisation qui ne permettent pas l'utilisation de java.util.Random
, consultez cette alternative .
Voir également cette réponse pour les variations de ma suggestion. Il comprend également une fonction d'extension pour les Char
s aléatoires .
java.util.Random
?Générer un entier aléatoire entre
from
(inclus) etto
(exclusif)la source
Int
s aléatoires à distance , vous pouvez utiliser Random # int (size, from, to) à la place dans java-8 .Depuis kotlin 1.2, vous pouvez écrire:
(1..3).shuffled().last()
Sachez simplement que c'est un gros O (n), mais pour une petite liste (en particulier des valeurs uniques), tout va bien: D
la source
Vous pouvez créer une fonction d'extension similaire à
java.util.Random.nextInt(int)
mais qui prend unIntRange
au lieu d'unInt
pour sa borne:Vous pouvez maintenant l'utiliser avec n'importe quelle
Random
instance:Si vous ne souhaitez pas avoir à gérer votre propre
Random
instance, vous pouvez définir une méthode pratique en utilisant, par exempleThreadLocalRandom.current()
,:Vous pouvez maintenant obtenir un entier aléatoire comme vous le feriez dans Ruby sans avoir à déclarer d'abord une
Random
instance vous-même:la source
Variation possible de mon autre réponse pour les caractères aléatoires
Afin d'obtenir des
Char
s aléatoires , vous pouvez définir une fonction d'extension comme celle-ciSi vous travaillez avec JDK> 1.6, utilisez à la
ThreadLocalRandom.current()
place deRandom()
.Pour les kotlinjs et autres cas d'utilisation qui ne permettent pas l'utilisation de
java.util.Random
, cette réponse vous aidera.Kotlin> = 1.3 support multiplateforme pour Random
Depuis la 1.3, Kotlin est livré avec son propre générateur aléatoire multiplateforme. Il est décrit dans ce KEEP . Vous pouvez désormais utiliser directement l'extension dans le cadre de la bibliothèque standard Kotlin sans la définir:
la source
En s'appuyant sur l' excellente réponse @ s1m0nw1, j'ai apporté les modifications suivantes.
Code:
Cas de test:
la source
Exemples aléatoires dans la plage [1, 10]
ou en utilisant Java Random
la source
Kotlin> = 1.3, support multiplateforme pour Random
Depuis la version 1.3, la bibliothèque standard fournissait un support multi-plateforme pour les aléas, voir cette réponse.
Kotlin <1.3 sur JavaScript
Si vous travaillez avec Kotlin JavaScript et que vous n'avez pas accès à
java.util.Random
, ce qui suit fonctionnera:Utilisé comme ceci:
la source
Une autre façon d'implémenter la réponse de s1m0nw1 serait d'y accéder via une variable. Non pas que ce soit plus efficace mais cela vous évite d'avoir à taper ().
Et maintenant, il est accessible en tant que tel
la source
Dans Kotlin 1.3, vous pouvez le faire comme
la source
Il n'y a pas de méthode standard pour cela, mais vous pouvez facilement créer la vôtre en utilisant l'un
Math.random()
ou l' autre ou la classejava.util.Random
. Voici un exemple utilisant laMath.random()
méthode:Ceci est un exemple de sortie:
la source
La bibliothèque standard de Kotlin ne fournit pas d'API Random Number Generator. Si vous n'êtes pas dans un projet multiplateforme, il vaut mieux utiliser l'api de la plateforme (toutes les autres réponses à la question parlent de cette solution) .
Mais si vous êtes dans un contexte multiplateforme, la meilleure solution est d'implémenter l'aléatoire par vous-même en kotlin pur pour partager le même générateur de nombres aléatoires entre les plateformes. C'est plus simple pour le développement et les tests.
Pour répondre à ce problème dans mon projet personnel, j'implémente un pur générateur de congruence linéaire Kotlin . LCG est l'algorithme utilisé par
java.util.Random
. Suivez ce lien si vous souhaitez l'utiliser: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Mon objectif de mise en œuvre
nextInt(range: IntRange)
pour vous;).Faites attention à mon objectif, LCG est bon pour la plupart des cas d'utilisation (simulation, jeux, etc.) mais ne convient pas à une utilisation cryptographique en raison de la prévisibilité de cette méthode.
la source
Si les numéros que vous souhaitez choisir ne sont pas consécutifs, vous pouvez utiliser
random()
.Usage:
Renvoie l'un des nombres figurant dans la liste.
la source
Plus besoin d'utiliser des fonctions d'extension personnalisées. IntRange a maintenant une
random()
fonction d'extension prête à l'emploi .la source
En utilisant une fonction de niveau supérieur, vous pouvez obtenir exactement la même syntaxe d'appel que dans Ruby (comme vous le souhaitez):
Usage:
la source
Tout d'abord, vous avez besoin d'un RNG. Dans Kotlin, vous devez actuellement utiliser les plates-formes spécifiques (il n'y a pas de Kotlin intégré). Pour la JVM, c'est
java.util.Random
. Vous devrez en créer une instance, puis appelerrandom.nextInt(n)
.la source
J'espère que cela t'aides.
la source
Vous pouvez créer une fonction d'extension:
Valeur flottante ronde:
Utilisation de la méthode:
Production:
la source
Code source complet. Peut contrôler si les doublons sont autorisés.
la source
Chaque fois qu'il y a une situation où vous souhaitez générer une clé ou une adresse mac qui est un nombre hexadécimal ayant des chiffres basés sur la demande de l'utilisateur, et cela aussi en utilisant Android et Kotlin, alors mon code ci-dessous vous aide:
la source
être super duper))
la source