Tutorial C#: Cómo programar un generador de Amigo Invisible (Sin trampas)
- jordi650
- 26 dic 2025
- 2 Min. de lectura
¿Alguna vez te ha tocado organizar el "Amigo Invisible" y has tenido que repetir el sorteo tres veces porque a alguien le tocó su propio nombre? Como programadores, sabemos que hay una forma mejor de hacerlo: con código.
Hoy vamos a crear una pequeña aplicación de consola en C# que resuelve este problema en milisegundos. Es un ejercicio excelente para practicar lógica, listas y aleatoriedad, conceptos que usamos a diario en el desarrollo de videojuegos.
El problema lógico: Evitar que te toque a ti mismo
Mucha gente intenta programar esto eligiendo una persona al azar para cada participante. ¿El problema? A menudo quedan "huecos" o la última persona se queda consigo misma.
La solución más elegante, y la que usaremos hoy, es la Lógica Circular:
Tomamos la lista de participantes.
La "barajamos" (desordenamos) aleatoriamente.
Hacemos que cada persona le regale a la siguiente en la lista, y la última a la primera.
¡Así garantizamos matemáticamente que nadie se regala a sí mismo y el bucle es perfecto!
El Código Fuente en C#
Abre tu editor de código y prueba este script:
C#
using System;
using System.Collections.Generic;
using System.Linq;
namespace SorteoAmigoInvisible
{
class Program
{
static void Main(string[] args)
{
// 1. Definimos los participantes
List<string> participantes = new List<string>
{
"Ana", "Carlos", "Beatriz", "David", "Elena", "Fernando"
};
Console.WriteLine("--- SORTEO AMIGO INVISIBLE ---");
// 2. Barajamos la lista (Shuffle) usando un GUID para la aleatoriedad
// Esta es una forma rápida de desordenar una lista en C#
var listaMezclada = participantes.OrderBy(x => Guid.NewGuid()).ToList();
// 3. Asignamos los regalos
for (int i = 0; i < listaMezclada.Count; i++)
{
string quienRegala = listaMezclada[i];
string quienRecibe;
// Usamos el operador módulo (%) para conectar el último con el primero
// Esto crea un círculo perfecto
int indiceReceptor = (i + 1) % listaMezclada.Count;
quienRecibe = listaMezclada[indiceReceptor];
Console.WriteLine($"{quienRegala} le regala a... -> {quienRecibe}");
}
Console.ReadKey();
}
}
}
Explicación para principiantes
Si estás empezando en el mundo del código, fíjate en estos dos detalles:
OrderBy(x => Guid.NewGuid())
En videojuegos, usamos esto constantemente para "loot" aleatorio o para barajar mazos de cartas. Guid.NewGuid() genera un identificador único y complejo que, al usarlo para ordenar, desordena la lista de forma muy efectiva.
El Operador Módulo %
La línea (i + 1) % listaMezclada.Count es magia pura.
Si estamos en la posición 0, nos da 1.
Si estamos en la última posición (ej. 5) y hay 6 personas, la operación nos devuelve 0. Esto permite que el código "dé la vuelta" y conecte el final con el principio sin necesidad de escribir condicionales complejos (if/else).
¿Te gusta resolver problemas lógicos?
Este script es solo la punta del iceberg. La programación de videojuegos se basa en utilizar esta lógica para crear inventarios, inteligencias artificiales y físicas.
Si te ha parecido interesante entender cómo funciona este sorteo por dentro, imagina lo que podrías crear con herramientas más potentes como Unity o Unreal Engine. En Only VR Store nos encanta enseñar a mirar "detrás de Matrix".
Aprende a programar videojuegos en Valdemoro
En nuestra academia presencial no solo aprendemos código, creamos experiencias. Desde los fundamentos de C# hasta el manejo de motores gráficos como Unity o Unreal. ¡Únete a nuestra academia de programación hoy mismo!
























Comentarios