Weiß jemand von einem Algorithmus, der eindeutige Bingo-Kartengesichter generieren kann? Ich möchte diesen Algorithmus in C# implementieren.
Danke,
Weiß jemand von einem Algorithmus, der eindeutige Bingo-Kartengesichter generieren kann? Ich möchte diesen Algorithmus in C# implementieren.
Danke,
Holen Sie sich 5 Sätze mit jeweils 15 Zahlen (1-15 für Satz 1, 16-30 für Satz 2...)
Wählen Sie 5 verschiedene Zahlen in den Sätzen 1,2,4,5 aus
Wählen Sie 4 verschiedene Zahlen im Satz 3 aus
Um zu überprüfen, ob diese Karte bereits existiert
Überprüfen Sie jede vorhandene Karte auf die Übereinstimmung oben links mit neuer Karte
Wenn beide Zahlen gleich sind, gehen Sie zur zweiten Zahl über
Wenn Sie 24 Mal dieselbe Zahl am selben Ort erhalten, sind beide Karten gleich und die neue Karte muss abgelehnt werden
Vielleicht könntest du eine Funktion erstellen, die die Bingo-Karte eindeutig hasht, anstatt jeden Wert vergleichen zu müssen?
Endet schließlich damit, etwas leicht unterschiedliches zu tun, aber entlang ähnlicher Linien wie von Ihnen oben vorgeschlagen und verwendet ein Wörterbuch, um die Muster der 5 Spalten zu hashen (jede Spalte auf eine Permutation von 5 Zahlen aus 15 reduzierend) und es scheint sowohl in Leistung als auch im Speicherverbrauch recht gut zu funktionieren.
Ich bin mir nicht sicher, ob es effizienter ist, da Sie immer 24 Zahlen hashen müssen, während Sie in der if-Lösung im besten Fall nur 1 Vergleich haben. Es wäre richtig, eine kleine Verteilungswahrscheinlichkeit zu berechnen und es sei denn, Sie generieren eine große Anzahl von Karten, bezweifle ich, dass Sie so viele Kollisionen haben werden.
Dies ist ein interessantes Problem, aber wie Michael Madsen berichtet hat, wäre es wahrscheinlich besser, sie zufällig zu generieren und dann zu überprüfen, ob Sie Duplikate haben. (Es sei denn, Sie möchten alle 111 Billiarden Möglichkeiten generieren, für die ich hoffe, dass Sie Speicherplatz haben!)
Hier ist eine Funktion zum Generieren einer zufälligen Teilmenge von Ganzzahlen aus einem gegebenen Bereich, die für Sie nützlich sein könnte:
private static IEnumerable RandomSubsetOfRange(int min, int max, int count)
{
Random random = new Random();
int size = max - min + 1;
for (int i = 0; i <= size; i += 1)
{
if (random.NextDouble() <= ((float)count / (float)(size - i + 1)))
{
yield return min + i;
count -= 1;
}
}
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
faqs.org/patents/app/20090100118 Es ist wahrscheinlich patentiert.
3 Stimmen
@dtb: Ich verleihe Ihnen den Preis für die Untertreibung des Jahres: Sie verlinken zu einem Patent auf einer Patentseite und warnen dann, dass die Idee "wahrscheinlich patentiert" ist. hehe
0 Stimmen
Beachten Sie, dass es 111.007.923.832.370.565 mögliche verschiedene Bingo-Karten gibt, unter der Annahme von US-Karten (3003 Permutationen pro Spalte, 1365 für die mittlere). Die Wahrscheinlichkeit von Duplikaten ist unglaublich klein.
0 Stimmen
Und hier dachte ich, dass Algorithmen nicht patentiert werden könnten.
0 Stimmen
Addon-Kommentar: Die Anzahl der möglichen Bingo-Karten, die ich zur Verfügung gestellt habe, gilt nur, wenn Sie "einzigartig" definieren als enthaltend verschiedene Zahlen und die Reihenfolge innerhalb der Spalten ignorieren. Wenn Sie zwei Karten als unterschiedlich betrachten, auch wenn nur die Reihenfolge innerhalb der Spalten unterschiedlich ist (das bedeutet, "1 2 3 4 5" ist anders als "5 4 3 2 1"), dann steigt die Anzahl der möglichen Karten auf beeindruckende 552.446.474.061.128.648.601.600.000. Das sind 552 Septillionen oder etwas mehr als die Hälfte eines Oktilliarde.