Domina la creación de datos de prueba con un reto clave: la carga aleatoria de evaluaciones. Pondrás en práctica lo aprendido sobre generación aleatoria para crear evaluaciones reales por curso, asignatura y alumno, con nombres al azar y notas flotantes entre 0.0 y 5.0. El objetivo es claro: aprender haciendo, con autonomía y creatividad.
¿En qué consiste el reto de carga aleatoria de evaluaciones?
Este desafío te pide generar datos coherentes y variados sin depender de soluciones únicas. Lo esencial es respetar las reglas del modelo: cursos con asignaturas y alumnos, y evaluaciones que pertenecen a ambos. No hay una única forma correcta: la clave es construir una solución funcional y comprensible.
¿Cuántas evaluaciones y con qué notas?
Cinco evaluaciones por asignatura, por cada alumno, en cada curso.
Nota aleatoria entre 0.0 y 5.0.
La nota debe ser decimal, no entera: usa un número flotante.
El nombre de la evaluación también debe ser generado al azar.
¿Qué significa ser creativo aquí?
Probar distintas formas de generar valores aleatorios.
Variar estrategias: pocas o muchas líneas, más o menos eficientes.
Priorizar soluciones claras y reproducibles.
¿Cómo deben relacionarse evaluaciones, alumnos y asignaturas?
Cada curso mantiene una lista de asignaturas y una lista de alumnos. Toda evaluación debe estar mapeada a un alumno existente y a una asignatura existente. Así garantizas consistencia en los datos de prueba y evitas evaluaciones “huérfanas”.
¿Qué mapeos son obligatorios?
Evaluación → Alumno: cada evaluación pertenece a un alumno creado previamente.
Evaluación → Asignatura: cada evaluación pertenece a una asignatura existente.
El curso provee el contexto con sus listas de alumnos y asignaturas.
¿Qué validar al generar la evaluación?
Pertenencia: alumno y asignatura deben existir en el curso.
Aleatoriedad: nombre y nota deben variar de forma realista.
Tipo de dato: la nota es flotante con decimales.
¿Qué habilidades y decisiones se trabajan en este reto?
Aquí aplicas lo visto sobre generación de contenido aleatorio y llevas más lejos tu criterio técnico. No hay una “solución perfecta”, pero sí decisiones informadas y razonadas.
¿Qué habilidades clave desarrollarás?
Generación de números aleatorios flotantes para notas decimalizadas.
Modelado de relaciones: curso, asignaturas, alumnos, evaluaciones.
Diseño con eficiencia variable: soluciones cortas o largas, simples o complejas.
Autonomía en investigación: busca cómo producir valores flotantes.
Colaboración: contrasta enfoques en la sección de comentarios.
Aprender haciendo: materializa lo aprendido con datos de prueba completos.
Te leo en comentarios: comparte tu enfoque, explica tus decisiones y compara resultados con tus compañeros para mejorar tu solución.
Después agregué la variable "evaluacion" en la clase Asignaturas.
Porque debe de haber 5 asignaturas por alumno, y cada asignatura por alumno solo lleva 1 evaluación, también una lista.
En "class EscuelaEngine", el metodo CargarAsignaturas(), lo deje así. Ahí mismo genero la evaluación de forma aleatoria con NextDouble() * (5), para que sea de 0 - 5.
Y en CargarCursos(), agrego otros for each, para llenar 5 asignaturas por alumno con una sola calificacion por materia - alumno. (En el reto no se menciona que las materias van aleatorias, solo las evaluaciones)
privatevoidCargarCursos(){...Random rndAlumno =newRandom();foreach(var curso inEscuela.Cursos){ int cantRandom = rndAlumno.Next(5,20); curso.Alumnos=GenerarAlumnosAlAzar(cantRandom);//llena alumnos por cursoforeach(var alumno in curso.Alumnos){ alumno.Asignaturas=CargarAsignaturas();//llena asignaturas por alumno}}...}
Excelente !!
Yo lo hice asi
private void CargarEvaluaciones()
{
int[] evaluacionNro = { 1, 2, 3, 4, 5 };
// creo las evaluaciones
foreach (Curso curso in Escuela.Cursos)
{
var evaluaciones = from alumno in curso.Alumnos
from asignatura in curso.Asignaturas
from nro in evaluacionNro
select new Evaluacion()
{
Nombre = $"\"Examen {nro}\"",
Alumno = alumno,
Asignatura = asignatura,
Nota = (float)getRandomMark()
};
curso.Evaluaciones = evaluaciones.ToList();
}
}
decimal getRandomMark()
{
Random random = new Random();
decimal mark = random.Next(1, 50) / 10;
// redondeamos a un decimal
return decimal.Round(mark, 1);
}
Para el curso 501, y un alumno en particular, me quedan las siguientes evaluaciones.
Yo agregue una lista de Evaluacionesdentro de Asignatura, mi solución:
privatevoidCargarEvaluaciones(){foreach(var curso inEscuela.Cursos){foreach(var alumno in curso.Alumnos){foreach(var asignatura in curso.Asignaturas){for(int i =0; i <5; i++){ asignatura.Evaluaciones.Add(newEvaluaciones{Alumno= alumno,Asignatura= asignatura,Nota=(float)Math.Round(GenerarNota(),2,MidpointRounding.ToEven),Nombre=GenerarNombre(asignatura.Nombre, alumno.Nombre)});}}}}}private string GenerarNombre(string asignatura, string alumno){DateTime fecha =DateTime.Now;return $"{asignatura.ToUpper()}_{alumno}_{fecha.ToLongDateString()}";}private double GenerarNota(){Random rnd =newRandom();return rnd.NextDouble()*5;}
Buena solucion!
Agregar un for a la carga de evaluaciones y el método toString a la clase Evaluaciones le daría mas elegancia a tu código ya de por si elegante.
tener un bucle dentro de un bucle, esta bien, 3 bucles esta esta mas o menos tirando a mejor busca otra manera de implementar, hacer uso de 4 bucles es ser osado :-) y es mejor replantear lo que se esta haciendo.
Reto comprendido:
\n
Por cada Alumno de cada Curso, generar 5 evaluaciones por cada asignatura. La evaluación debe tener una nota entre 0.0 y 5.0
\n
CargarEvaluaciones();
privatevoidCargarEvaluaciones(){foreach(var curso inthis.Escuela.Cursos){ curso.Evaluaciones=newList<Evaluacion>();foreach(var alumno in curso.Alumnos){foreach(var asignatura in curso.Asignaturas){ curso.Evaluaciones.AddRange(GenerarEvaluacion(alumno, asignatura));}}}}
Muy bueno, pero por lo que investigue nadie sacaría 5.0
Agregue lista de Evaluaciones en Alumno y en la clase Evaluacion hay una propiedad de tipo Alumno y otra de tipo Asignatura.
privatevoidCargarEvaluaciones(){Random random =newRandom(); string[]Asignaturas=Escuela.ListaCursos.FirstOrDefault().Asignaturas.Select(item=> item.Nombre).ToArray(); string[]NumeroEvaluacion={"1","2","3","4","5"};var listaEvaluaciones =from n1 inEscuela.ListaCursosfrom n2 in n1.Alumnosfrom n3 in n1.Asignaturasfrom n4 inNumeroEvaluacion select newEvaluaciones{Nombre= $"Evaluacion de {n3.Nombre} # {n4}",Asignatura= n3,Alumno= n2,Nota=(float)Math.Round((random.NextDouble()*5),1)};foreach(var alumno inEscuela.ListaCursos.SelectMany(item=> item.Alumnos)){ alumno.Evaluaciones= listaEvaluaciones.Where(item=> item.Alumno.UniqueId== alumno.UniqueId).ToList();}}
En Alumno.cs agregué
public List<Evaluaciones> Evaluaciones{ get; set; }
Resulta que .Next() nunca nos da el valor máximo, por eso puse 6 en los enteros y 10 en los decimales
private float GenerarNotaAlAzar(){Random intNotaRnd =newRandom();Random decNotaRnd =newRandom(); float nota = decNotaRnd.Next(0,10); nota /=10; nota += intNotaRnd.Next(0,6);if(nota >5){ nota =(float)Math.Floor(nota);}return nota;}privatevoidCargarEvaluaciones(){foreach(var curso inEscuela.Cursos){foreach(var alumno in curso.Alumnos){var listaEvaluaciones =newList<Evaluaciones>();foreach(var asignatura in curso.Asignaturas){ listaEvaluaciones.Add(newEvaluaciones{Nombre= $"Evaluacion {asignatura}",Alumno= alumno,Asignatura= asignatura,Nota=GenerarNotaAlAzar()});} alumno.Evaluaciones= listaEvaluaciones;}}}
Además de agregar el siguiente atributo a la clase Alumno:
public List<Evaluacion> Evaluaciones { get; set; }
Así quedó mi código
Hola a todos, esta fue mi solución:
privatevoidCargarEvaluaciones(){foreach(var curso inEscuela.Cursos){foreach(var alumno in curso.Alumnos){ alumno.Evaluaciones=newList<Evaluacion>();foreach(var asignatura in curso.Asignaturas){for(int i =0; i <5; i++){Random rnd =newRandom();var evaluacion =newEvaluacion{Nombre= $"Evaluación N°{i+1} de {asignatura.Nombre}",Alumno= alumno,Asignatura= asignatura,Nota=(float)rnd.NextDouble()*5}; alumno.Evaluaciones.Add(evaluacion);}}}}}
Espero les sea útil
Yo hice algo muy parecido a esta solución pero la lista la agregué como propiedad del curso y no del alumno.
Hola tengo una duda una evaluacion ¿Que nombre llevaria? para saber como generarlo aleatoriamente
Hola!
Me podrías regalar más contexto sobre lo que quieres generar para poder ayudarte mejor?
Lo que hice fue adicionar una lista de tipo Test a la clase Student
publicList<Test>Tests{ get; set;}
En la clase SchoolEngine, adicione dos metodos el primero que recorre la lista de cursos y de cada curso manda la lista de estudiantes y la lista de materias a otro metodo.
Lo que hace el metodo GenerateTest es que genera 5 test de cada materia por alumno, lo almacena en la lista de listTest y luego lo asigna a la lista del alumno.
Hice una sentencia con LINQ y una función para generar la nota:
Adicionalmente, cambie el **get ** de Nota en Evaluacion para mostrar dos decimales:
privatevoidCargarEvaluaciones(){foreach(var curso inEscuela.Cursos){ float[] notes ={GenerarEvaluacion(),GenerarEvaluacion(),GenerarEvaluacion(),GenerarEvaluacion(),GenerarEvaluacion()};var evaluaciones =from al in curso.Alumnosfrom asig in curso.Asignaturasfrom n in notes
select newEvaluaciones(){Alumno= al,Asignatura= asig,Nota= n
}; curso.Evaluaciones= evaluaciones.ToList();}}private float GenerarEvaluacion(){Random rnd =newRandom();return(float)rnd.Next(0,50)/(float)10;}
Buenas,recorrí los cursos e hice un producto cartesiano entre los arreglos Curso.Alumnos, Curso.Asignatura y nombreEvaluacion, al finalizar cada curso guarde el listado en una variable y cuando conseguí todos los listados hice una recorrida al listado general y le asigne una nota luego lo retorne. El nombre lo genere concatenando un string con un Guid,
privateList<Evaluaciones>GeneraEvaluaciones(){var listadoGeneral =newList<Evaluaciones>();foreach(var curso inEscuela.Cursos){String[] nombreEvaluacion ={NombreExamen("Primer"),NombreExamen("Segundo"),NombreExamen("Tercer"),NombreExamen("Cuarto"),NombreExamen("Quinto")};var listaEvaluaciones =from nom in nombreEvaluacion
from alum in curso.Alumnosfrom asig in curso.Asignaturas select newEvaluaciones{Nombre=nom,Alumno=alum,Asignatura=asig }; listadoGeneral.AddRange(listaEvaluaciones.ToList());}Random rnd =newRandom();foreach(var examen in listadoGeneral){ float not = rnd.Next(1,50); not /=10; examen.Nota= not;}return listadoGeneral.OrderBy((al)=> al.Alumno).ToList();}privateStringNombreExamen(string nom){return nom+"-Examen-"+Guid.NewGuid().ToString().Substring(1,5);}
privatevoidCargarEvaluaciones(){Random random =newRandom(); string[] numeroEvaluaciones ={"1","2","3","4","5"};foreach(var curso inEscuela.Cursos){var evaluaciones =from asignatura in curso.Asignaturasfrom alumno in curso.Alumnosfrom nroEvaluacion in numeroEvaluaciones
select newEvaluaciones(){Nombre= $"{asignatura.Nombre}-{alumno.Nombre}-{nroEvaluacion}",Nota=generarNota(maximaNota:5),Alumno= alumno,Asignatura= asignatura,}; curso.Evaluaciones= evaluaciones.ToList();}}private float generarNota(int maximaNota =10){Random random =newRandom(); float nota =(float)(random.Next(0, maximaNota *10))/10;return nota;}
Aquí obtengo 5 nombres aleatorios de un conjunto de nombres.
Aquí adicionalmente valido que no exeda el maximo de la nota.
En el video no quedó claro que se debe crear 5 evaluaciones por alumno, se dijo 5 evaluaciones por asignatura mas no se especificó que era 5 por alumno para que lo tengan en cuenta ✌🏼 (Vengo del futuro).
Una Evaluación es medir el rendimiento de un alumno en una determinada asignatura por lo que es lógico asumir que es 5 por alumno.
Pueda ser que lo hice diferente pero según entendí las instrucciones había que generar 5 evaluaciones x asignatura lo cual es fue lo que hice, primero recorro por cada curso, por cada alumno y asignatura.
El resultado es: si existe 4 asignaturas entonces 4*5=20 en total por alumno que contiene 4 asignatura y cada asignatura tiene 5 evaluaciones.
Alguien lo entendió así o solo yo?
privatevoidCargarEvaluaciones(){foreach(var curso inEscuela.Cursos){var rnd =newRandom();List<Evaluacion> listaEvualuacion =newList<Evaluacion>();foreach(var alumno in curso.Alumnos){foreach(var asignatura in curso.Asignaturas){for(int i =1; i <=5; i++){ float cantRandom =(float)(0.5+(5.0-0.5)* rnd.NextDouble());var eval =newEvaluacion(){Nombre= $" Evaluacion{i} {asignatura.Nombre}",Alumno= alumno,Asignatura= asignatura,Nota= cantRandom
}; listaEvualuacion.Add(eval);}}} curso.Evaluaciones= listaEvualuacion;}}
A que se refiere carga aleatoria de evaluaciones? No estoy entendiendolo bien.
En la Clase Evaluaiones cambie el Float Nota por List<float> Nota;
En la Clase Curso agrege la propiedad: public List<Evaluaciones> Evaluaciones { get; set; }
En la Clase EscuelaEngine en metodo CargarEvaluaciones cree un producto cartesiano para cada Curso con sus alumnos y susasiganturas, con un metodo para crear un nombre random y otro para asignar notas al azar entre 0.0 y 5.0