Die Technik, die ich in der Regel verwendet werden, wenn die Liste Länge 1 ist eine zufällige ganze Zahl r
in [1,n-1]
zu erzeugen, und wenn r
größer oder gleich ist, dann auf diesen einzigen illegal Wert r
inkrementieren.
Dies kann für eine Liste der Länge k
für kleine k
verallgemeinert werden, sondern erfordert diese Liste Sortierung (Sie können Ihre Vergleichs- und Schritt in zufälliger Reihenfolge nicht tun). Wenn die Liste mäßig lang ist, können Sie nach der Sortierung mit einer bsearch beginnen und die Anzahl der übersprungenen Werte zu r
hinzufügen und dann in den Rest der Liste rekursiv gehen.
Eine Liste der Länge k
, kein Wert, der größer oder gleich n-k
enthalten, Sie kann eine direkte Substitution tun: erzeugen zufällige r
in [1,n-k]
und dann durch die Liste Tests durchlaufen, wenn r
zu list[i]
gleich ist. Wenn es ist, dann setzen Sie r
auf n-k+i
(dies setzt voraus, list
ist Null-basierte) und beenden. Dieser zweite Ansatz schlägt fehl, wenn sich einige der Listenelemente in [n-k,n]
befinden.
Ich könnte versuchen, etwas Gescheites zu diesem Zeitpunkt zu investieren, aber was ich bisher für eine gleichmäßige Verteilung mit Werten von k
ausreichend scheint viel weniger als n
...
- zwei Listen erstellen - einer der illegalen Werte unter
n-k
, und der andere der Rest (dies kann vor Ort getan werden).
- generieren zufällige
r
in [1,n-k]
- die direkte Substitution Ansatz für die erste Liste Übernehmen (wenn
r
ist list[i]
eingestellt dann r
zu n-k+i
und gehen Sie zu Schritt 5).
- Wenn
r
in Schritt 3 nicht geändert wurde, dann sind wir fertig.
- Sortieren Sie die Liste der größeren Werte und verwenden Sie die Compare-and-Increment-Methode.
Beobachtungen:
- Wenn alle Werte in der unteren Liste sind, wird es keine Art, denn es gibt nichts zu sortieren ist.
- Wenn sich alle Werte in der oberen Liste befinden, wird keine Sortierung vorgenommen, da es keine Veranlassung gibt,
r
in den Gefahrenbereich zu fahren.
- Da
k
Ansätze n
nähert, wächst die maximale Größe der oberen (sortierten) Liste.
- Für eine gegebene
k
, wenn mehr Wert in der oberen Liste erscheint (je größer die Sortierung), die Chance, einen Treffer in der unteren Liste zu erhalten, schrumpft, die Wahrscheinlichkeit der Notwendigkeit, die Sortierung zu tun.
Refinement: Offensichtlich Dinge sehr Sorty für große k
, aber in solchen Fällen die Liste hat vergleichsweise wenige Löcher, in die r
erlaubt ist, zu begleichen. Dies könnte sicherlich ausgenutzt werden.
Ich könnte etwas anderes vorschlagen, wenn viele zufällige Werte mit der gleichen Liste und Grenzen benötigt wurden. Ich hoffe, dass die Liste der ungültigen Werte nicht die Liste der Ergebnisse der vorherigen Aufrufe an diese Funktion ist, denn wenn Sie dann möchten, dann möchten Sie nichts davon - stattdessen würden Sie eine Fisher-Yates Shuffle wollen.
Ich nehme an, Sie wollen, dass es stattdessen effizient sein nur Zahlen zu generieren, bis es nicht in deiner Liste ist? –
"Die Liste ist möglicherweise nicht sortiert" - Ich lese das "wird unsortiert dargestellt" statt "Sie können die Liste nicht sortieren". Es kann hilfreich sein, mögliche Implementierungssprachen anzugeben. Python und C++ haben Funktionen definiert, die nützlich sind, zum Beispiel – Spaceghost
Wenn n klein ist, können Sie eine Liste von Elementen erstellen, für Ihr Beispiel wäre das Array {2,5,6,7.444,66, .. 500 } (Sie erhalten den Punkt) und generieren Sie dann einfach einen zufälligen Index wie rand (493) in Ihrem Beispiel. und nimm das Element aus dem Array [rand (493)]. – Mark