Um método genérico que pode retornar um número inteiro aleatório entre 2 parâmetros, como o ruby faz com rand(0..n)
.
Alguma sugestão?
Minha sugestão seria uma função de extensão no IntRange para criar randoms como este:(0..10).random()
A partir da versão 1.3, o Kotlin vem com seu próprio gerador aleatório multiplataforma. É descrito neste KEEP . A extensão descrita abaixo agora faz parte da biblioteca padrão do Kotlin , basta usá-la assim:
val rnds = (0..10).random()
Antes da versão 1.3, na JVM, usamos Random
ou mesmo ThreadLocalRandom
no JDK> 1.6.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
Usado assim:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Se você deseja que a função retorne apenas 1, 2, ..., 9
( 10
não incluída), use um intervalo construído com until
:
(0 until 10).random()
Se você estiver trabalhando com JDK> 1.6, use em ThreadLocalRandom.current()
vez de Random()
.
KotlinJs e outras variações
Para kotlinjs e outros casos de uso que não permitem o uso java.util.Random
, consulte esta alternativa .
Além disso, veja esta resposta para obter variações de minha sugestão. Também inclui uma função de extensão para Char
s aleatórios .
java.util.Random
?Gere um número inteiro aleatório entre
from
(inclusive) eto
(exclusivo)fonte
Int
s aleatórios à distância , use Random # int (tamanho, de, até) em java-8 .No kotlin 1.2, você poderia escrever:
(1..3).shuffled().last()
Esteja ciente de que é grande O (n), mas para uma pequena lista (especialmente de valores únicos) está tudo bem: D
fonte
Você pode criar uma função de extensão semelhante a
java.util.Random.nextInt(int)
uma que aceita um emIntRange
vez de umInt
para seu limite:Agora você pode usar isso com qualquer
Random
instância:Se você não deseja gerenciar sua própria
Random
instância, pode definir um método de conveniência usando, por exemploThreadLocalRandom.current()
:Agora você pode obter um número inteiro aleatório como faria no Ruby sem precisar primeiro declarar uma
Random
instância:fonte
Possível variação da minha outra resposta para caracteres aleatórios
Para obter
Char
s aleatórios , você pode definir uma função de extensão como estaSe você estiver trabalhando com JDK> 1.6, use em
ThreadLocalRandom.current()
vez deRandom()
.Para kotlinjs e outros casos de uso que não permitem o uso
java.util.Random
, esta resposta ajudará.Kotlin> = 1.3 suporte multiplataforma para Random
A partir da versão 1.3, o Kotlin vem com seu próprio gerador aleatório multiplataforma. É descrito neste KEEP . Agora você pode usar diretamente a extensão como parte da biblioteca padrão do Kotlin sem defini-la:
fonte
Com base na resposta excelente do @ s1m0nw1, fiz as seguintes alterações.
Código:
Caso de teste:
fonte
Exemplos aleatórios no intervalo [1, 10]
ou utilizando Java Random
fonte
Kotlin> = 1.3, suporte multiplataforma para Random
A partir da versão 1.3, a biblioteca padrão forneceu suporte multiplataforma para randoms, veja esta resposta.
Kotlin <1.3 em JavaScript
Se você estiver trabalhando com o Kotlin JavaScript e não tiver acesso
java.util.Random
, o seguinte funcionará:Usado assim:
fonte
Outra maneira de implementar a resposta de s1m0nw1 seria acessá-la através de uma variável. Não que seja mais eficiente, mas evita que você precise digitar ().
E agora ele pode ser acessado como tal
fonte
No Kotlin 1.3, você pode fazê-lo como
fonte
Não existe um método padrão que faça isso, mas você pode facilmente criar o seu próprio usando
Math.random()
a classe oujava.util.Random
. Aqui está um exemplo usando oMath.random()
método:Esta é uma saída de amostra:
fonte
A lib padrão do Kotlin não fornece a API Random Number Generator. Se você não estiver em um projeto de multiplataforma, é melhor usar a API da plataforma (todas as outras respostas da pergunta falam sobre esta solução) .
Mas se você estiver em um contexto de multiplataforma, a melhor solução é implementar aleatoriamente sozinho no puro kotlin para compartilhar o mesmo gerador de números aleatórios entre plataformas. É mais simples para desenvolvedores e testes.
Para responder a esse problema no meu projeto pessoal, implementei um gerador de congruência linear Kotlin puro . LCG é o algoritmo usado por
java.util.Random
. Siga este link se desejar usá-lo: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Meu objetivo de implementação
nextInt(range: IntRange)
para você;).Tome cuidado com o meu objetivo, o LCG é bom para a maioria dos casos de uso (simulação, jogos, etc ...), mas não é adequado para uso criptográfico devido à previsibilidade desse método.
fonte
Se os números que você deseja escolher não forem consecutivos, você pode usar
random()
.Uso:
Retorna um dos números que estão na lista.
fonte
Não é mais necessário usar funções de extensão personalizadas. O IntRange agora possui uma
random()
função de extensão pronta para uso.fonte
Usando uma função de nível superior, você pode obter exatamente a mesma sintaxe de chamada que no Ruby (como desejar):
Uso:
fonte
Primeiro, você precisa de um RNG. No Kotlin, você atualmente precisa usar os específicos da plataforma (não há um Kotlin embutido em um). Para a JVM é
java.util.Random
. Você precisará criar uma instância e depois chamarrandom.nextInt(n)
.fonte
Espero que isto ajude.
fonte
Você pode criar uma função de extensão:
Valor flutuante redondo:
Uso do método:
Resultado:
fonte
Código fonte completo. Pode controlar se duplicatas são permitidas.
fonte
Sempre que houver uma situação em que você queira gerar um endereço chave ou mac, que seja um número hexadecimal com dígitos com base na demanda do usuário e que também use o android e o kotlin, o código abaixo ajudará você:
fonte
ser super duper))
fonte