Un método genérico que puede devolver un entero aleatorio entre 2 parámetros como lo hace Ruby con rand(0..n)
.
¿Cualquier sugerencia?
Mi sugerencia sería una función de extensión en IntRange para crear randoms como este:(0..10).random()
A partir de 1.3, Kotlin viene con su propio generador aleatorio multiplataforma. Se describe en este MANTENER . La extensión que se describe a continuación ahora es parte de la biblioteca estándar de Kotlin , simplemente úsela así:
val rnds = (0..10).random()
Antes de 1.3, en la JVM usamos Random
o incluso ThreadLocalRandom
si estamos en JDK> 1.6.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
Usado así:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Si desea que la función solo regrese 1, 2, ..., 9
( 10
no incluida), use un rango construido con until
:
(0 until 10).random()
Si está trabajando con JDK> 1.6, use en ThreadLocalRandom.current()
lugar de Random()
.
KotlinJs y otras variaciones
Para kotlinjs y otros casos de uso que no permiten el uso de java.util.Random
, vea esta alternativa .
Además, vea esta respuesta para ver las variaciones de mi sugerencia. También incluye una función de extensión para Char
s aleatorios .
java.util.Random
?Genere un entero aleatorio entre
from
(inclusivo) yto
(exclusivo)fuente
Int
s aleatorios a distancia , puede usar Random # int (size, from, to) en su lugar en java-8 .A partir de kotlin 1.2, podría escribir:
(1..3).shuffled().last()
Solo tenga en cuenta que es grande O (n), pero para una lista pequeña (especialmente de valores únicos) está bien: D
fuente
Puede crear una función de extensión similar a
java.util.Random.nextInt(int)
una que tome un enIntRange
lugar de unInt
para su límite:Ahora puede usar esto con cualquier
Random
instancia:Si no desea tener que administrar su propia
Random
instancia, puede definir un método conveniente utilizando, por ejemploThreadLocalRandom.current()
:Ahora puede obtener un número entero aleatorio como lo haría en Ruby sin tener que declarar primero una
Random
instancia usted mismo:fuente
Posible variación a mi otra respuesta para caracteres aleatorios
Para obtener
Char
s aleatorios , puede definir una función de extensión como estaSi está trabajando con JDK> 1.6, use en
ThreadLocalRandom.current()
lugar deRandom()
.Para kotlinjs y otros casos de uso que no permiten el uso de
java.util.Random
, esta respuesta será de ayuda.Kotlin> = 1.3 soporte multiplataforma para Aleatorio
A partir de 1.3, Kotlin viene con su propio generador aleatorio multiplataforma. Se describe en este MANTENER . Ahora puede usar directamente la extensión como parte de la biblioteca estándar de Kotlin sin definirla:
fuente
Partiendo de la excelente respuesta de @ s1m0nw1 , hice los siguientes cambios.
Código:
Caso de prueba:
fuente
Ejemplos aleatorios en el rango [1, 10]
o utilizando Java Random
fuente
Kotlin> = 1.3, soporte multiplataforma para Aleatorio
A partir de 1.3, la biblioteca estándar proporcionó soporte multiplataforma para randoms, consulte esta respuesta.
Kotlin <1.3 en JavaScript
Si está trabajando con Kotlin JavaScript y no tiene acceso
java.util.Random
, funcionará lo siguiente:Usado así:
fuente
Otra forma de implementar la respuesta de s1m0nw1 sería acceder a ella a través de una variable. No es que sea más eficiente, pero le ahorra tener que escribir ().
Y ahora se puede acceder como tal
fuente
En Kotlin 1.3 puedes hacerlo como
fuente
No existe un método estándar que haga esto, pero puede crear fácilmente el suyo usando cualquiera de
Math.random()
los dos o la clasejava.util.Random
. Aquí hay un ejemplo usando elMath.random()
método:Esta es una salida de muestra:
fuente
Kotlin standard lib no proporciona API de generador de números aleatorios. Si no está en un proyecto multiplataforma, es mejor usar la API de plataforma (todas las otras respuestas de la pregunta hablan sobre esta solución) .
Pero si se encuentra en un contexto multiplataforma, la mejor solución es implementar aleatoriamente usted mismo en Kotlin puro para compartir el mismo generador de números aleatorios entre plataformas. Es más simple para desarrolladores y pruebas.
Para responder a este problema en mi proyecto personal, implemento un generador congruencial lineal Kotlin puro . LCG es el algoritmo utilizado por
java.util.Random
. Sigue este enlace si quieres usarlo: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Mi propósito de implementación
nextInt(range: IntRange)
para ti;).Tenga cuidado con mi propósito, LCG es bueno para la mayoría de los casos de uso (simulación, juegos, etc.) pero no es adecuado para el uso criptográfico debido a la previsibilidad de este método.
fuente
Si los números que desea elegir no son consecutivos, puede usarlos
random()
.Uso:
Devuelve uno de los números que están en la lista.
fuente
Ya no es necesario usar funciones de extensión personalizadas. IntRange tiene una
random()
función de extensión lista para usar ahora.fuente
Usando una función de nivel superior, puede lograr exactamente la misma sintaxis de llamada que en Ruby (como lo desee):
Uso:
fuente
Primero, necesitas un RNG. En Kotlin actualmente necesita usar los específicos de la plataforma (no hay un Kotlin integrado en uno). Para la JVM es
java.util.Random
. Tendrá que crear una instancia y luego llamarrandom.nextInt(n)
.fuente
Espero que esto ayude.
fuente
Podría crear una función de extensión:
Valor de flotación redonda:
Uso del método:
Salida:
fuente
Código fuente completo Puede controlar si se permiten duplicados.
fuente
Siempre que haya una situación en la que desee generar una clave o una dirección mac que sea un número hexadecimal que tenga dígitos basados en la demanda del usuario, y que también use Android y Kotlin, entonces mi código a continuación lo ayudará:
fuente
ser súper tonto))
fuente