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
möglich Duplikat: http://stackoverflow.com/q/4299138/121309 –
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 –
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