top of page

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:

  1. Tomamos la lista de participantes.

  2. La "barajamos" (desordenamos) aleatoriamente.

  3. 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


Entradas destacadas
Entradas recientes
Archivo
Buscar por tags
Síguenos
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page