2016-05-19 6 views
0

Ich konnte eine Funktion schreiben, die "eindeutige & & zufällige" Ganzzahlen innerhalb eines Bereichs generieren kann. Aber das in n . Ich benutze es für 6 zufällige Eingänge an einem Ort und 30 zufällige Eingänge an anderen, also wie können wir es verbessern, wenn es nötig ist, es zu verbessern?Wie erzeugt man effizient N zufällige Ints von 0 bis num in C#?

private int[] genRands(int max, int totalRandomIntsRequired) 
    { 
     int[] nums = new int[totalRandomIntsRequired]; 

     Random r = new Random(); 
     for (int i = 0; i < totalRandomIntsRequired; i++) 
     { 
      nums[i] = r.Next(0, max + 1); 

      for (int j = i; j >= 0; j--) 
      { 
       if(nums[i] == nums[j]) 
       { 
        nums[i] = r.Next(0, max + 1); 
       } 
      } 
     } 
     return nums; 
    } 
+0

Warum Looping Sie zweimal? – Steve

+1

Verwenden Sie kein Array zum Speichern der bereits erstellten Werte. – Steve

+0

oh sorry, ich dachte, es würde mich über jeden Kommentar informieren. Ich wiederhole zweimal, um zu prüfen, ob es irgendwelche Duplikate gibt. Was soll ich anstelle von Array dann @Steve verwenden? –

Antwort

5

hier ist ein Ansatz mit einer HashSet die Duplikate nicht zulässt, und als effiziente interne Dublettenprüfung.

public static int[] genRands(int total, int max) 
{ 
    if (max < total) 
    { 
     throw new IndexOutOfRangeException(); 
    } 
    Random _random = new Random(); 
    HashSet<int> Result = new HashSet<int>(); 
    while (Result.Count < total) 
    { 
     Result.Add(_random.Next(0, max)); 
    } 
    return Result.ToArray(); 
} 
+0

Danke Mann! es funktioniert .... –

+0

du bist willkommen !! – fubo

0

Ich bin ein wenig verwirrt, was Sie fragen, ob Sie nur 6 oder n Zufallszahlen erzeugen müssen, warum zweimal Schleife? So oder so können Sie dies ausprobieren

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var rands = genRands(100, 6); 
      foreach (var num in rands.Select((n, i) => new { i= i + 1, n })) 
      { Console.WriteLine(string.Format("[{0}] {1}", num.i, num.n));}; 
      Console.ReadLine(); 
     } 
     private static List<int> genRands(int max, int total) 
     { 
      var nums = new List<int>(); 
      Random r = new Random(); 
      for (int i = 0; i < total; i++) 
       nums.Add(r.Next(0, max)); 
      return nums; 
     } 
    } 
} 

Es sollte eine Ausgabe so etwas wie dieses

[1] 45 
[2] 29 
[3] 40 
[4] 75 
[5] 29 
[6] 57 
+0

Es kann Duplikate in 'nums' geben - OP will _unique && random_ – fubo

+0

sie müssen auch eindeutig sein. Deshalb schleife ich zweimal und checke jede Iteration ein, wenn diese Nummer nicht bereits im Array ist. –

+0

Oh ich habe die einzigartige Anforderung in der ersten Frage nicht gesehen. Mein schlechtes –

Verwandte Themen