Mock-objectos e fixtures em testes C++: como escrever código sem medo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como Fazer o Android "Jogar os Dados"? Desvendando a Geração de Números Aleatórios em Kotlin

\n\n

Você já se perguntou como seu telefone "escolhe" um número aleatório? Parece uma tarefa simples — obter um inteiro aleatório de 5 a 10. Mas por baixo dos panos do Android e do Kotlin existe todo um mecanismo que afeta não apenas a conveniência, mas também a segurança da sua aplicação. Não é surpresa que a pergunta "Como posso gerar um número aleatório em um intervalo específico no Android?" tenha acumulado milhares de visualizações no Stack Overflow. Não vamos apenas dar uma resposta pronta — vamos analisar o código-fonte e descobrir o que realmente está acontecendo.

\n\n

Neste artigo, você aprenderá:

\n
    \n
  • Como gerar corretamente um número aleatório em um determinado intervalo em Kotlin.
  • \n
  • Como kotlin.random.Random, java.util.Random e SecureRandom diferem.
  • \n
  • Por que uma classe é necessária para jogos de azar e outra para geração de senhas.
  • \n
  • Como evitar erros comuns que transformam "aleatoriedade" em previsibilidade.
  • \n
\n\n

Vamos nessa!

\n\n

O Clássico: Random em Kotlin (e Por Que Nem Sempre Está Certo)

\n\n

A maneira mais óbvia é usar kotlin.random.Random. Ele está embutido na linguagem e funciona imediatamente. Veja como fica a geração de um número aleatório de 0 a 100 (inclusive):

\n\n
import kotlin.random.Random\n\nfun main() {\n    val randomNumber = Random.nextInt(0, 101) // de 0 a 100 inclusive\n    println("Número aleatório: $randomNumber")\n}
\n\n

É simples. Mas vamos olhar por baixo do capô. Random.nextInt(from, until) internamente usa java.util.Random (na plataforma JVM). Este, por sua vez, gera números usando um gerador congruencial linear (LCG). A fórmula é simples:

\n\n

new_seed = (old_seed * A + C) mod M

\n\n

Onde A, C e M são constantes. É rápido, mas não é criptograficamente seguro. Se um invasor descobrir alguns números, ele pode recuperar a semente e prever todos os subsequentes.

\n\n

Quando usar: Para jogos (que não envolvam dinheiro), selecionar aleatoriamente um item de uma lista, embaralhar cartas em uma aplicação comum.

\n\n

Nível Avançado: ThreadLocalRandom para Multithreading

\n\n

Se sua aplicação usa ativamente corrotinas ou multithreading, um Random comum pode se tornar um gargalo. Cada chamada a nextInt() é sincronizada para evitar condições de corrida. A solução é ThreadLocalRandom do Java:

\n\n
import java.util.concurrent.ThreadLocalRandom\n\nfun getRandomInRange(min: Int, max: Int): Int {\n    return ThreadLocalRandom.current().nextInt(min, max + 1)\n}
\n\n

Esta classe aloca uma instância separada de Random para cada thread. Nenhuma sincronização é necessária — cada thread trabalha com seu próprio gerador. Na prática, isso proporciona um ganho de desempenho em cenários multithread.

\n\n

Segurança Acima de Tudo: SecureRandom

\n\n

Agora imagine que você está gerando uma senha de uso único (OTP) ou um token para recuperação de conta. Usar um Random comum é um crime. É aqui que entra o SecureRandom:

\n\n
import java.security.SecureRandom\n\nfun generateSecureCode(length: Int): String {\n    val secureRandom = SecureRandom()\n    val digits = "0123456789"\n    return (1..length)\n        .map { digits[secureRandom.nextInt(digits.length)] }\n        .joinToString("")\n}
\n\n

SecureRandom coleta entropia de fontes do sistema operacional: ruído do microfone, temporização do teclado (no emulador — do arquivo /dev/random ou /dev/urandom). Isso o torna imprevisível. Mas isso tem um custo em velocidade — pode ser dezenas de vezes mais lento que um Random comum.

\n\n

Importante: No Android, S

Blogs

Book Recommendations