270 votes

Comment obtenir un nombre aléatoire en Kotlin ?

Une méthode générique qui peut retourner un entier aléatoire entre 2 paramètres comme ruby le fait avec rand(0..n) .

Une suggestion ?

617voto

s1m0nw1 Points 21698

Ma suggestion serait un extension fonction sur IntRange pour créer des aléas comme celui-ci : (0..10).random()

TL;DR Kotlin >= 1.3, un Random pour toutes les plateformes

Depuis la version 1.3, Kotlin est livré avec son propre générateur de hasard multiplateforme. Il est décrit dans ce GARDER . L'extension décrite ci-dessous est maintenant partie de la bibliothèque standard de Kotlin il suffit de l'utiliser comme ceci :

val rnds = (0..10).random() // generated random from 0 to 10 included

Kotlin < 1.3

Avant la version 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 vouliez que la fonction ne renvoie que 1, 2, ..., 9 ( 10 non inclus), utilisez une gamme construite avec until :

(0 until 10).random()

Si vous travaillez avec JDK > 1.6, utilisez ThreadLocalRandom.current() au lieu de Random() .

KotlinJs et autres variantes

Pour kotlinjs et d'autres cas d'utilisation qui ne permettent pas l'utilisation de l'option java.util.Random voir cette alternative .

Voir aussi réponse pour les variations de ma suggestion. Il comprend également une fonction d'extension pour les Char s.

0 votes

Je suppose que cela utilise également la méthode Java java.util.Random ?

0 votes

@SimonForsberg En effet. J'ai ajouté une autre réponse qui n'en fait pas usage : stackoverflow.com/a/49507413/8073652

0 votes

Il existe également une proposition visant à ajouter un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG) ici : github.com/Kotlin/KEEP/issues/184

50voto

Magnus Points 5093

Générer un nombre entier aléatoire entre from (inclus) et to (exclusif)

import java.util.Random

val random = Random()

fun rand(from: Int, to: Int) : Int {
    return random.nextInt(to - from) + from
}

1 votes

Si vous voulez obtenir un couple de rangées aléatoires Int vous pouvez utiliser Random#int(taille,de,à) à la place dans java-8 .

4 votes

Cette solution ne fonctionne pas sur Javascript / Native Kotlin. Il serait peut-être intéressant de créer une méthode plus générique pour faire cela :)

0 votes

@ValentinMichalak vous pouvez essayer celui-là : stackoverflow.com/a/49507413/8073652

37voto

mutexkid Points 210

À partir de kotlin 1.2, vous pouvez écrire :

(1..3).shuffled().last()

Sachez juste que c'est un gros O(n), mais pour une petite liste (surtout de valeurs uniques) c'est très bien :D

0 votes

Celui-ci est utile pour kotlin-native

12voto

mfulton26 Points 1609

Vous pouvez créer un fonction d'extension similaire à java.util.Random.nextInt(int) mais un qui prend un IntRange au lieu d'un Int pour sa limite :

fun Random.nextInt(range: IntRange): Int {
    return range.start + nextInt(range.last - range.start)
}

Vous pouvez maintenant l'utiliser avec n'importe quel Random instance :

val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, 8, or 9

Si vous ne voulez pas avoir à gérer votre propre Random vous pouvez alors définir une méthode de commodité en utilisant, par exemple, l'option suivante, ThreadLocalRandom.current() :

fun rand(range: IntRange): Int {
    return ThreadLocalRandom.current().nextInt(range)
}

Vous pouvez maintenant obtenir un entier aléatoire comme vous le feriez en Ruby sans avoir à déclarer au préalable un fichier Random Installez-vous :

rand(5..9) // returns 5, 6, 7, 8, or 9

11voto

s1m0nw1 Points 21698

Variation possible de mon autre réponse pour les caractères aléatoires

Afin d'obtenir des données aléatoires Char vous pouvez définir une fonction d'extension comme suit

fun ClosedRange<Char>.random(): Char = 
       (Random().nextInt(endInclusive.toInt() + 1 - start.toInt()) + start.toInt()).toChar()

// will return a `Char` between A and Z (incl.)
('A'..'Z').random()

Si vous travaillez avec JDK > 1.6, utilisez ThreadLocalRandom.current() au lieu de Random() .

Pour kotlinjs et d'autres cas d'utilisation qui ne permettent pas l'utilisation de l'option java.util.Random , cette réponse vous aidera.

Support multiplateforme de Kotlin >= 1.3 pour Random

Depuis la version 1.3, Kotlin dispose de son propre générateur de hasard multiplateforme. Il est décrit dans ce GARDER . Vous pouvez maintenant utiliser directement l'extension comme partie intégrante de la bibliothèque standard de Kotlin sans la définir :

('a'..'b').random()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X