1001Ferramentas
👥Geradores

Gerador de Grupos Aleatórios

Divide uma lista de nomes em N grupos aleatórios de tamanho equilibrado. Útil para sortear equipes em sala de aula ou eventos.


  

Como dividir N pessoas em K grupos aleatórios

Dividir uma lista de N pessoas em K grupos equilibrados aleatoriamente é um problema clássico e aparece em sala de aula, hackathons, torneios e sorteios de amigo secreto. Dois ingredientes são necessários: um embaralhamento justo da lista, e uma regra determinística para percorrer a lista embaralhada e atribuir cada pessoa a um grupo. A escolha do embaralhamento é o que determina se a distribuição é realmente uniforme.

Fisher-Yates: o embaralhamento correto

O Fisher-Yates shuffle (publicado originalmente em 1938 e reescrito na forma moderna por Richard Durstenfeld em 1964) é o padrão-ouro. Em uma única passada linear ele produz cada uma das n! permutações com igual probabilidade. A versão in-place moderna é:

for (let i = arr.length - 1; i > 0; i--) {
  const j = Math.floor(Math.random() * (i + 1));
  [arr[i], arr[j]] = [arr[j], arr[i]];
}

Roda em tempo O(n) e memória extra O(1). A alternativa ingênua — arr.sort(() => Math.random() - 0.5) — é viesada em vários engines de JavaScript (o TimSort do V8, por exemplo) e ainda é mais lenta, O(n log n). Nunca use para nada que precise de justiça.

Distribuindo o resto quando N não é múltiplo de K

Se n = 10 e k = 3, três grupos não podem ter o mesmo tamanho. A regra justa é round-robin: percorrer a lista embaralhada e jogar a pessoa i no grupo i % k. Alguns grupos terminam com ⌈n/k⌉ = 4 e os demais com ⌊n/k⌋ = 3; os excedentes são distribuídos uniformemente entre os primeiros n mod k grupos. É o que o gerador acima faz.

Casos de uso comuns e restrições

  • Sala de aula — dividir uma turma de 30 alunos em duplas ou trios para um exercício.
  • Chave de torneio — sortear uma chave de mata-mata a partir de uma lista embaralhada.
  • Pair programming / code review — pares aleatórios que rotacionam a cada sprint.
  • Hackathons — sortear cores, temas ou números de mesa.
  • Amigo secreto — mesma ideia, mais um teste de desarranjo para que ninguém tire o próprio nome (re-sortear ou backtracking até atender).

Variantes do mundo real costumam adicionar restrições: não colocar as pessoas X e Y no mesmo grupo; equilibrar por gênero, senioridade ou skill; limitar o tamanho de cada grupo. A implementação mais simples é gera-e-testa: embaralha, verifica restrições, re-embaralha se violou. Para restrições densas, troque por backtracking explícito ou propagação de restrições.

Round-robin vs aleatório

Round-robin é determinístico — útil quando a justiça ao longo de várias rodadas importa (cada jogador enfrenta cada outro exatamente uma vez). A partição aleatória oferece um sorteio fresco e é preferível quando o objetivo é quebrar agrupamentos habituais. Muitos formatos de torneio começam com seeding aleatório e depois mudam para round-robin ou rodadas suíças.

Perguntas frequentes

A mesma pessoa pode aparecer em dois grupos? Não. O algoritmo é uma partição: cada nome da lista de entrada é atribuído a exatamente um grupo.

O que acontece se N for menor que K? Alguns dos K grupos ficam vazios. A ferramenta cria K grupos mesmo assim; os últimos simplesmente têm zero membros.

A ordem dentro de cada grupo também é embaralhada? Sim — como o shuffle acontece uma vez sobre a lista inteira antes de particionar, os membros dentro de cada grupo também aparecem em ordem aleatória.

Math.random() é bom o suficiente? Para sorteios sociais/educacionais, sim. Para qualquer coisa com dinheiro, prêmios ou trilha de auditoria, use uma fonte criptograficamente segura (crypto.getRandomValues) e idealmente uma semente publicamente verificável.

Ferramentas Relacionadas