2016-12-03 3 views
0

generieren Nun, ich muss 2 Zahlen im Bereich von (1,8) generieren. Angenommen, die ersten beiden Zahlen sind 3 & 4. In der zweiten Zeit wird der Bereich 3 & 4 ausschließen, das ist, was ich erreichen möchte. Auf diese Weise wird die Schleife 4 Mal fortgesetzt.Müssen ein Paar Zahlen aus einem bestimmten Bereich in C#

Ich habe es versucht ... aber nicht weitergehen kann
Ich weiß Random Klasse zu verwenden ist

Der Bereich festgelegt ist

Jede Art von Hilfe wird accepted.Thanks im voraus sein

+1

möglich Duplikat: http://stackoverflow.com/q/4299138/121309 –

+1

Verwenden Wählen Sie aus einer Liste zufällig, und entfernen Sie die ausgewählten Elemente aus der Liste, bevor Sie das zweite Mal auswählen. Sehen Sie sich https://www.ma.utexas.edu/users/parker/sampling/repl.htm –

+1

Angenommen, dass 3 und 4 nur Beispiele sind, "Enumerable.Range (1,8)", mischen Sie sie, fügen Sie sie ein ein Stapel und pop sie, wie Sie sie brauchen – Plutonix

Antwort

3

Ansatz 1 (Classical):

static List<Tuple<int, int>> GetPairs(int min, int max, Random r) 
{ 
    var items = new List<Tuple<int, int>>(); 
    var pickedItems = new HashSet<int>(); 
    int count = (max - min + 1); 

    Func<int> randAndCheck =() => 
    { 
     int? candidate = null; 

     while(candidate == null || pickedItems.Contains(candidate.Value)) 
      candidate = r.Next(min, max + 1); 

     pickedItems.Add(candidate.Value); 
     return candidate.Value; 
    }; 

    while (pickedItems.Count != count) 
    { 
     int firstItem = randAndCheck(); 
     int secondItem = randAndCheck(); 

     items.Add(Tuple.Create(firstItem, secondItem)); 
    } 

    return items; 
} 

Verbrauch:

static void Main(string[] args) 
{ 
    foreach(var pair in GetPairs(1, 8, new Random())) 
    { 
     Console.WriteLine($"One: {pair.Item1} Two: {pair.Item2}"); 
    } 
} 

Ausgang:

One: 4 Two: 2 
One: 8 Two: 3 
One: 5 Two: 1 
One: 7 Two: 6 

Ansatz 2 mit irgendwie zufälliger Reihenfolge und unterscheidet Ausführung:

static IEnumerable<Tuple<int, int>> TwoAtATime(int min, int max, Random r) 
{ 
    var enumerator = Enumerable.Range(min, max - min + 1) 
           .OrderBy(x=> r.Next()).GetEnumerator(); 

    while(enumerator.MoveNext()) 
    { 
     int item1 = enumerator.Current; 
     if (enumerator.MoveNext()) 
     { 
      int item2 = enumerator.Current; 
      yield return Tuple.Create(item1, item2); 
     } 
    } 
} 

Verbrauch:

static void Main(string[] args) 
{ 
    foreach(var pair in TwoAtATime(1, 8, new Random())) 
    { 
     Console.WriteLine($"One: {pair.Item1} Two: {pair.Item2}"); 
    } 
} 

Ausgang:

One: 2 Two: 5 
One: 4 Two: 7 
One: 1 Two: 6 
One: 8 Two: 3 
+0

http://Stackoverflow.com/questions/4299138/generate-n-random-and- unique-numbers-in-a-range/18055921 # 18055921 Dies diente meinem Zweck @ user3185569 – ispostback

0

Hier ist der Code:

using System.Collections.Generic; 
namespace TestApp 
{ 
    class Program 
    { 
     static readonly Random rand = 
      new Random(DateTime.Now.Millisecond); 

     static void Main(string[] args) 
     { 
      var pickList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8}; 
      while (pickList.Count > 1) 
      { 
       Console.WriteLine(
        "Hit any key to get Random pair of integers from List."); 
       Console.ReadLine(); 
       var pair = GetPairFromList(pickList); 
       Console.WriteLine($"Pair is: {pair.Item1}: {pair.Item2}"); 
      } 
      Console.WriteLine("List is empty; Hit any key to exit."); 
      Console.ReadLine(); 
     } 
     private static Tuple<int, int> GetPairFromList(IList<int> picks) 
     { 
      return new Tuple<int, int>(
       GetIntFromList(picks), 
       GetIntFromList(picks)); 
     } 
     private static int GetIntFromList(IList<int> picks) 
     { 
      // next line is where random picking happens 
      var val = picks[(int)(picks.Count*rand.NextDouble())]; 
      // remove randomly selected item from list 
      picks.Remove(val); 
      return val; 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/4299138/generate-n-random-and-unique-numbers-within-a- Bereich/18055921 # 18055921 Dies diente meinem Zweck Thnks @Charles Bretana – ispostback

+0

Dann können Sie es als akzeptierte Antwort markieren? –

Verwandte Themen