El objetivo del programa es generar un conjunto aleatorio de ganadores a partir de un número de participantes y un número de ganadores especificado por el usuario. El programa verifica que el número de ganadores sea menor o igual al número de participantes y luego utiliza un generador de números aleatorios para seleccionar al azar los ganadores y los almacena en un vector. Por cada ejecución, el programa obtendrá una selección de ganadores diferente y se muestrará el resultado en una lista numerada del 0 a 'n' números. Este programa es ideal para sorteos y rifas pequeños.
#include <iostream>
#include <random>
#include <vector>
#include <chrono>
#include <set>
int main() {
int n, m;
std::cout << "Ingrese el número de participantes: ";
std::cin >> n;
std::cout << "Ingrese el número de ganadores: ";
std::cin >> m;
if (m > n) {
std::cerr << "Error: el número de ganadores no puede ser mayor al número de participantes." << std::endl;
return 1;
}
// Creamos un vector con los números de los participantes
std::vector<int> numbers(n);
// Generamos una semilla para la generación de números aleatorios a partir de la hora actual
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
// Creamos un generador de números aleatorios con la semilla generada
std::default_random_engine generator(seed);
// Creamos una distribución uniforme de enteros entre 1 y n para generar los números aleatorios
std::uniform_int_distribution<int> distribution(1, n);
// Creamos un conjunto para almacenar los números que ya fueron seleccionados como ganadores
std::set<int> used_numbers;
// Generamos m números aleatorios y los almacenamos en el vector de números
for (int i = 0; i < m; i++) {
int number;
do {
// Generamos un número aleatorio y verificamos que no haya sido seleccionado antes
number = distribution(generator);
} while (used_numbers.count(number));
used_numbers.insert(number);
numbers[i] = number;
}
// Imprimimos la lista de ganadores del 1 a n
std::cout << "Ganadores:" << std::endl;
for (int i = 1; i <= n; i++) {
std::cout << i << " | ";
int count = 0;
for (int j = 0; j < m; j++) {
if (numbers[j] == i) {
count++;
}
}
for (int k = 0; k < count; k++) {
std::cout << "*";
}
std::cout << std::endl;
}
return 0;
}
Expliquemos más a detalle su funcionamiento: Primero se pide al usuario que ingrese un número de participantes ('n') y un número de ganadores ('m'), y se verifica que el primer valor sea menor al segundo utilizando un bucle 'if'.
El código ha sido probado en Code::Blocks en Windows, por lo que es completamente funcional.
NOTA: Si al correr el programa los acentos o caracteres especiales no se muestran correctamente, puedes usar esta solución: ¿Cómo mostrar acentos y caracteres especiales en programas escritos en C++?