Generando valores aleatorios y únicos C #

He buscado por un tiempo y he estado luchando para encontrar esto, estoy tratando de generar varios números aleatorios, únicos es C #. Estoy usando System.Random, y estoy usando una semilla datetime.now.ticks:

public Random a = new Random(DateTime.Now.Ticks.GetHashCode()); private void NewNumber() { MyNumber = a.Next(0, 10); } 

Llamaré a NewNumber () regularmente, pero el problema es que a menudo obtengo números repetidos. Algunas personas sugirieron porque estaba declarando el azar cada vez que lo hacía, no producía un número aleatorio, así que puse la statement fuera de mi función. ¿Alguna sugerencia o mejor manera que usar System.Random? Gracias

Llamaré a NewNumber () regularmente, pero el problema es que a menudo obtengo números repetidos.

Random.Next no garantiza que el número sea único. También su rango es de 0 a 10 y es probable que obtenga valores duplicados. Puede ser que pueda configurar una lista de int e insertar números aleatorios en la lista después de verificar si no contiene el duplicado. Algo como:

 public Random a = new Random(); // replace from new Random(DateTime.Now.Ticks.GetHashCode()); // Since similar code is done in default constructor internally public List randomList = new List(); int MyNumber = 0; private void NewNumber() { MyNumber = a.Next(0, 10); if (!randomList.Contains(MyNumber)) randomList.Add(MyNumber); } 

Puede intentar mezclar una matriz de posibles entradas si su rango es solo de 0 a 9. Esto agrega el beneficio de evitar cualquier conflicto en la generación de números.

 var nums = Enumerable.Range(0, 10).ToArray(); var rnd = new Random(); // Shuffle the array for (int i = 0;i < nums.Length;++i) { int randomIndex = rnd.Next(nums.Length); int temp = nums[randomIndex]; nums[randomIndex] = nums[i]; nums[i] = temp; } // Now your array is randomized and you can simply print them in order for (int i = 0;i < nums.Length;++i) Console.WriteLine(nums[i]); 

Estoy publicando una implementación correcta de un algoritmo de mezcla, ya que el otro publicado aquí no produce una mezcla uniforme.

Como dice la otra respuesta, para que un pequeño número de valores se aleatorice, simplemente puede llenar una matriz con esos valores, mezclar la matriz y luego usar los valores que desee.

La siguiente es una implementación de Fisher-Yates Shuffle (también conocido como Knuth Shuffle). (Lea la sección “errores de implementación” de ese enlace (busque “siempre seleccionando j de todo el rango de índices de matriz válidos en cada iteración”) para ver un poco de discusión sobre lo que está mal con la otra implementación publicada aquí).

 using System; using System.Collections.Generic; namespace ConsoleApplication2 { static class Program { static void Main(string[] args) { Shuffler shuffler = new Shuffler(); List list = new List{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; shuffler.Shuffle(list); foreach (int value in list) { Console.WriteLine(value); } } } /// Used to shuffle collections. public class Shuffler { /// Creates the shuffler with a  as the random number generator. public Shuffler() { _rng = new Random(); } /// Shuffles the specified array. /// The type of the array elements. /// The array to shuffle. public void Shuffle(IList array) { for (int n = array.Count; n > 1; ) { int k = _rng.Next(n); --n; T temp = array[n]; array[n] = array[k]; array[k] = temp; } } private System.Random _rng; } } 

NOTA, no recomiendo esto :). Aquí hay un “oneliner” también:

 //This code generates numbers between 1 - 100 and then takes 10 of them. var result = Enumerable.Range(1,101).OrderBy(g => Guid.NewGuid()).Take(10).ToArray(); 

Dependiendo de lo que realmente está buscando, puede hacer algo como esto:

 using System; using System.Collections.Generic; using System.Linq; namespace SO14473321 { class Program { static void Main() { UniqueRandom u = new UniqueRandom(Enumerable.Range(1,10)); for (int i = 0; i < 10; i++) { Console.Write("{0} ",u.Next()); } } } class UniqueRandom { private readonly List _currentList; private readonly Random _random = new Random(); public UniqueRandom(IEnumerable seed) { _currentList = new List(seed); } public int Next() { if (_currentList.Count == 0) { throw new ApplicationException("No more numbers"); } int i = _random.Next(_currentList.Count); int result = _currentList[i]; _currentList.RemoveAt(i); return result; } } } 

Y aquí mi versión de encontrar N números aleatorios únicos usando HashSet . Parece bastante simple, ya que HashSet solo puede contener diferentes elementos. Es interesante: ¿sería más rápido que usar List o Shuffler?

 using System; using System.Collections.Generic; namespace ConsoleApplication1 { class RnDHash { static void Main() { HashSet rndIndexes = new HashSet(); Random rng = new Random(); int maxNumber; Console.Write("Please input Max number: "); maxNumber = int.Parse(Console.ReadLine()); int iter = 0; while (rndIndexes.Count != maxNumber) { int index = rng.Next(maxNumber); rndIndexes.Add(index); iter++; } Console.WriteLine("Random numbers were found in {0} iterations: ", iter); foreach (int num in rndIndexes) { Console.WriteLine(num); } Console.ReadKey(); } } } 

Verifique este método listo para usar: proporcione un rango y recuento del número que desea obtener.

 public static int[] getUniqueRandomArray(int min, int max, int count) { int[] result = new int[count]; List numbersInOrder = new List(); for (var x = min; x < max; x++) { numbersInOrder.Add(x); } for (var x = 0; x < count; x++) { var randomIndex = Random.Range(0, numbersInOrder.Count); result[x] = numbersInOrder[randomIndex]; numbersInOrder.RemoveAt(randomIndex); } return result; } 

También puede usar una tabla de datos que almacene cada valor aleatorio, luego simplemente realice el método aleatorio mientras! = Valores en la columna de datos

Puede usar funciones aleatorias básicas de C #

 Random ran = new Random(); int randomno = ran.Next(0,100); 

Ahora puede usar el valor en el randomno en cualquier cosa que desee, pero tenga en cuenta que esto generará un número aleatorio entre 0 y 100 Only y puede extenderlo a cualquier figura.

Prueba esto:

 private void NewNumber() { Random a = new Random(Guid.newGuid().GetHashCode()); MyNumber = a.Next(0, 10); } 

Algunas exploraciones

Guid : base aquí : representa un identificador único global (GUID)

Guid.newGuid() produce un identificador único como "936DA01F-9ABD-4d9d-80C7-02AF85C822A8"

y será único en toda la base del universo aquí

El código Hash aquí produce un entero único de nuestro identificador único

así que Guid.newGuid().GetHashCode() nos da un número único y la clase aleatoria producirá números aleatorios reales arrojar este