Geração de números aleatórios em Swift: de random() ao GameplayKit

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

Swift e números aleatórios: a magia que funciona de forma previsível

\n\n

Todo desenvolvedor, mais cedo ou mais tarde, se depara com a tarefa: "Como gerar um número aleatório?". Parece simples, não é? Mas no mundo Swift, esse tópico percorreu um longo caminho de evolução — desde funções C antigas até uma API nativa elegante. Neste artigo, vamos explorar todas as formas de gerar números aleatórios em Swift, desde as mais simples até as industriais, com exemplos práticos e detalhes importantes.

\n\n

Se você já se perguntou por que seu arc4random() retorna números estranhos ou como fazer uma seleção aleatória real de um array, você está no lugar certo. Vamos nessa!

\n\n

Breve histórico: como chegamos até aqui

\n\n

Antes do Swift 4.2 (2018), os desenvolvedores sofriam para escolher entre arc4random(), drand48() e gambiarras como rand() % 100. Este último, aliás, era perigoso — viés (bias) na distribuição era garantido se o intervalo não fosse divisível exato por RAND_MAX. Com o lançamento do Swift 4.2, a Apple nos presenteou com o protocolo RandomNumberGenerator e métodos nativos. Agora, gerar números aleatórios se tornou seguro, legível e uniforme.

\n\n

O método moderno: RandomNumberGenerator e métodos de tipo

\n\n

A partir do Swift 4.2, a maneira mais correta e simples é usar métodos estáticos nos tipos:

\n\n
// Número inteiro aleatório de 1 a 100\nlet randomInt = Int.random(in: 1...100)\n\n// Número de ponto flutuante aleatório de 0.0 a 1.0\nlet randomDouble = Double.random(in: 0.0...1.0)\n\n// Número Float aleatório\nlet randomFloat = Float.random(in: 0.0...1.0)\n\n// Bool aleatório\nlet randomBool = Bool.random()\n
\n\n

Essa API usa o gerador de sistema SystemRandomNumberGenerator, que é criptograficamente seguro (mas falaremos disso mais adiante). Importante: o intervalo é definido com closed range (...) ou half-open range (..<).

\n\n

Por que isso é incrível?

\n
    \n
  • Segurança de tipos — o compilador não permite gerar um Double e atribuir a um Int.
  • \n
  • Sem viés — o Swift cuida da uniformidade da distribuição.
  • \n
  • Versatilidade — funciona para todos os tipos numéricos: Int, UInt, Int8, Float, Double, CGFloat e até Bool.
  • \n
\n\n

Gerando um número aleatório de um intervalo: armadilhas

\n\n

Parece simples, mas o que pode dar errado? Veja este exemplo:

\n\n
let diceRoll = Int.random(in: 1...6)  // Dado: 1,2,3,4,5,6\nlet coinFlip = Int.random(in: 0..<2)  // Moeda: 0 ou 1\n
\n\n

Tudo correto. Mas se você quiser gerar um número aleatório sem limite superior (por exemplo, de 0 ao infinito) — não vai funcionar. O Swift exige um intervalo explícito. Isso foi feito propositalmente para evitar erros de estouro.

\n\n

Se você precisa de um número aleatório de 0 até max (onde max é uma variável), basta usar:

\n\n
let maxValue = 500\nlet randomUpTo = Int.random(in: 0...maxValue)\n
\n\n

Elemento aleatório de uma coleção (Array, Set, Dictionary)

\n\n

Gerar um número aleatório muitas vezes não é o objetivo final, mas sim selecionar um elemento aleatório. O Swift oferece uma solução elegante:

\n\n
let fruits = ["maçã", "banana", "cereja", "melão"]\nif let randomFruit = fruits.randomElement() {\n    print("Hoje vamos comer \\(randomFruit)")\n} else {\n    print("A cesta está vazia!")\n}\n
\n\n

O método randomElement() retorna um valor opcional — isso é importante, pois a coleção pode estar vazia. Para embaralhar todo o array, use shuffled():

\n\n
let shuffledFruits = fruits.shuffled()\nprint(shuffledFruits) // exemplo: ["banana", "melão", "maçã", "cereja"]\n
\n\n

Geração criptograficamente segura: quando a segurança é prioridade

\n\n

O SystemRandomNumberGenerator padrão já é criptograficamente seguro, mas se você precisar de um controle mais fino, pode usar o SecRandomCopyBytes do Security framework. No entanto, para a maioria dos casos, o método nativo é suficiente. Lembre-se: para aplicações que exigem alta segurança (como tokens de autenticação), sempre prefira geradores criptográficos.

\n\n

GameplayKit: aleatoriedade para jogos

\n\n

Para desenvolvimento de jogos, o framework GameplayKit oferece geradores especializados, como GKRandomSource, GKLinearCongruentialRandomSource e GKMersenneTwisterRandomSource. Eles permitem criar sequências reproduzíveis (com seed) e distribuições personalizadas.

\n\n
import GameplayKit\n\nlet randomSource = GKLinearCongruentialRandomSource()\nlet randomInt = randomSource.nextInt(upperBound: 100) // 0 a 99\n
\n\n

Com GKRandomDistribution, você pode criar distribuições como GKGaussianDistribution para simular eventos mais realistas.

\n\n

Conclusão

\n\n

A geração de números aleatórios em Swift evoluiu muito. Hoje, temos ferramentas seguras, flexíveis e fáceis de usar. Seja para um simples jogo de dados ou para criptografia, o Swift oferece a solução certa. Agora é com você: experimente os exemplos e veja qual se encaixa melhor no seu projeto!

Blogs

Book Recommendations