Como puedo utilizar un numero random en un bucle sin que se repita?(cs)

Iniciado por Reent, 25 Julio 2019, 17:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Reent

Código (csharp) [Seleccionar]
for (int i = 0; i < questions.Length; i++)
           {
               
               Random rQuestions = new Random(Guid.NewGuid().GetHashCode());
               int rQ = rQuestions.Next(9);
               Console.WriteLine(questions[rQ]);
               Console.WriteLine(answers[rQ]);
               int iTry = int.Parse(Console.ReadLine());

               if (iTry == rAnswers[rQ])
               {
                   points++;
                   Console.WriteLine("Great!!");
               }
               else
               {
                   Console.WriteLine("False!!");
               }
               Console.WriteLine();
           }




Mod: Obligatorio el uso de etiquetas GeSHi. Los temas sobre C# van a su correspondiente subforo.

Serapis

Creas un array con suficientes números random (puedes asegurarte que no se repitan, o que no se repitan más de x veces)

En tu bucle luego tomas el nº random que yace en el array cuyo ciclo estás.

Obviamente si el bucle es muy muy grande (pongamos 1 millón), tu array debe ser de dicho tamaño, pero si es enormemente más grande, no resulta práctico, y en algún momento deberían repetirse...



Ahora, si lo que necesitas es que aparezca 1 sola vez todos los números de una lista, es más práctico hacer lo siguiente:
1 - Creas un array de dicho tamaño, en el primer bucle incluyes dichos valores, pongamos que quieres que que aparezcan una sola vez los valores del 35 al 53


declarar Array(0 a 53-35)

bucle para k desde 0 hasta 53-35
   array(k) = (k + 35)
siguiente


2 - ...pero están ordenados, como los quieres aleatorios hay que desordenarlos:

bucle para k desde 53-35 hasta 1 regresiva
   az = Random(entre 0 y k)
       
   tmp = Array(az)
   Array(az) = Array(k)
   Array(k) = tmp
siguiente


3 - Ahora ya podrás obtener los valores random, usarlos en tu bucle, y sin reptición... los tomas en orden del array porque en el array ya están colocados al azar y sin repetición (en el ejemplo valores solo del 35 al 53).


bucle para k desde 0 hasta 53-35
  valor = array(k)
  ...
siguiente

WHK

Todo va a depender la cantidad de valores que necesites, por ejemplo, si esto es una tarea eso quiere decir que debes unir las matemáticas. Por ejemplo, usas una variable para guardar el último valor creado, por defecto es cero, el nuevo valor es igual a ese valor guardado mas un numero random, luego el resultado lo guardas en la variable para generar el nuevo valor, esto asegurará que cada valor sea único.

Si necesitas algo práctico, necesitarás guardar todos los resultados y omitirlos de los resultados, pero es mas complicado, necesitarás forzadamente una base de datos ya sea en memoria, fs o sql.

Si necesitas hacer una app que genere identificadores únicos entonces debes utilizar un estandar que ya fue diseñado para ello y es el UUID, .Net lo soporta nativamente:

https://docs.microsoft.com/en-us/dotnet/api/system.guid.newguid?redirectedfrom=MSDN&view=netframework-4.8#System_Guid_NewGuid

Saludos.