Generazione di valori casuali e univoci C #

Ho cercato per un po ‘e ho faticato a trovarlo, sto provando a generare diversi numeri casuali e univoci è C #. Sto usando System.Random e sto usando un seed datetime.now.ticks:

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

Sto chiamando NewNumber () regolarmente, ma il problema è che ottengo spesso numeri ripetuti. Alcune persone hanno suggerito perché stavo dichiarando il random ogni volta che l’ho fatto, non avrebbe prodotto un numero casuale, quindi ho messo la dichiarazione fuori dalla mia funzione. Eventuali suggerimenti o modi migliori rispetto all’utilizzo di System.Random? Grazie

Sto chiamando NewNumber () regolarmente, ma il problema è che ottengo spesso numeri ripetuti.

Random.Next non specifica il numero per essere unico. Anche il tuo range va da 0 a 10 e probabilmente avrai dei valori duplicati. Può essere ansible impostare un elenco di int e inserire numeri casuali nell’elenco dopo aver controllato se non contiene il duplicato. Qualcosa di simile a:

 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); } 

Potresti provare a mescolare un array di possibili ints se il tuo range è compreso tra 0 e 9. Questo aggiunge il vantaggio di evitare qualsiasi conflitto nella generazione del numero.

 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]); 

Sto pubblicando una corretta implementazione di un algoritmo shuffle, dato che l’altro pubblicato qui non produce un shuffle uniforms.

Come indica l’altra risposta, per un numero limitato di valori da assegnare in modo casuale, è sufficiente riempire un array con tali valori, mescolare l’array e quindi utilizzare molti dei valori desiderati.

La seguente è un’implementazione di Fisher-Yates Shuffle (aka Knuth Shuffle). (Leggi la sezione “errori di implementazione” di quel collegamento (cerca “sempre selezionando j dall’intero intervallo di indici di array validi su ogni iterazione”) per vedere alcune discussioni su cosa c’è di sbagliato nell’altra implementazione pubblicata qui.)

 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, non lo consiglio 🙂 Ecco anche un “oneliner”:

 //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(); 

A seconda di cosa sei veramente dopo puoi fare qualcosa del genere:

 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; } } } 

E qui la mia versione di trovare N numeri univoci casuali usando HashSet . Sembra piuttosto semplice, dal momento che HashSet può contenere solo elementi diversi. È interessante – sarebbe più veloce di usare 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(); } } } 

Verifica questo metodo pronto per l’uso: inserisci un intervallo e il numero di numeri che desideri ottenere.

 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; } 

Puoi anche usare un dataTable che memorizza ogni valore casuale, quindi eseguire semplicemente il metodo casuale mentre! = Valori nella dataColumn

Puoi utilizzare le funzioni casuali di base di C #

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

ora puoi usare il valore in randomno in qualsiasi cosa tu voglia, ma tieni presente che questo genererà un numero casuale compreso tra 0 e 100 Solo ed è ansible estenderlo a qualsiasi figura.

Prova questo:

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

Alcune spiegazioni:

Guid : base qui : rappresenta un identificatore univoco globale (GUID)

Guid.newGuid() produce un identificatore univoco come "936DA01F-9ABD-4d9d-80C7-02AF85C822A8"

e sarà unico in tutto l’universo di base qui

Il codice hash qui produce un intero univoco dal nostro identificatore univoco

quindi Guid.newGuid().GetHashCode() ci dà un numero univoco e la class casuale produrrà numeri casuali reali lancia questo