Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Reent en 25 Julio 2019, 17:08 pm



Título: Como puedo utilizar un numero random en un bucle sin que se repita?(cs)
Publicado por: Reent en 25 Julio 2019, 17:08 pm
Código
  1. for (int i = 0; i < questions.Length; i++)
  2.            {
  3.  
  4.                Random rQuestions = new Random(Guid.NewGuid().GetHashCode());
  5.                int rQ = rQuestions.Next(9);
  6.                Console.WriteLine(questions[rQ]);
  7.                Console.WriteLine(answers[rQ]);
  8.                int iTry = int.Parse(Console.ReadLine());
  9.  
  10.                if (iTry == rAnswers[rQ])
  11.                {
  12.                    points++;
  13.                    Console.WriteLine("Great!!");
  14.                }
  15.                else
  16.                {
  17.                    Console.WriteLine("False!!");
  18.                }
  19.                Console.WriteLine();
  20.            }


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


Título: Re: Como puedo utilizar un numero random en un bucle sin que se repita?(cs)
Publicado por: Serapis en 26 Julio 2019, 20:20 pm
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

Código:
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:
Código:
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).

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


Título: Re: Como puedo utilizar un numero random en un bucle sin que se repita?(cs)
Publicado por: WHK en 27 Julio 2019, 05:19 am
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.