¿Qué es exactamente lo que quiere decir con "no debería ser repetitivo"? Si quiere decir que no desea obtener ninguno de los duplicados, entonces básicamente debe tomar una lista de los números 1-20, mezclarlos y luego agarrar uno a la vez del encabezado de la lista. Para una manera eficiente de mezclar una lista, vea this Stack Overflow answer.
Si solo quiere decir que su intento actual da 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 etc., entonces es probable que esté creando una nueva instancia de Random
cada vez que elija un número: no lo haga. Cada vez que creas una instancia, usará la hora actual como la "semilla" para el generador de números aleatorios (a menos que especifiques uno explícitamente). Eso significa que si crea varias instancias en sucesión rápida, cada una obtendrá la misma semilla y, por lo tanto, dará la misma secuencia de números.
En su lugar, use una sola instancia de Random
y vuelva a utilizarla. (Tenga en cuenta que no es seguro para subprocesos sin embargo, que es un dolor.) Por ejemplo:
private static readonly Random Rng = new Random();
public int NextNumber()
{
return Rng.Next(20) + 1;
}
que no va a ser flujos seguros, pero háganos saber si eso es un problema. Una alternativa es a veces para pasar el Random
en el método (que normalmente sería más complicado, por supuesto):
public int NextNumber(Random rng)
{
return rng.Next(20) + 1;
}
entonces la persona que llama puede reutilizar la instancia apropiada.
Si desea una forma segura de subprocesos para generar números aleatorios, es posible que desee consultar mi clase StaticRandom
en MiscUtil.
(Tenga en cuenta que el uso de rng.Next(1, 21)
también funcionaría bien - Sucede que prefieren la versión anterior ya que creo que reduce las conjeturas acerca de los límites inclusivas/exclusivas, pero es una cuestión de gusto personal.)
¿podría por favor seleccione la respuesta correcta para esta pregunta? –