Nicht sich wiederholende Zufallszahlen in Objective-C
Ich bin mit
for (int i = 1, i<100, i++)
int i = arc4random() % array count;
aber ich bin immer jedes mal wiederholt. Wie kann ich füllen das gewählte int
Wert aus dem Bereich, so dass, wenn die Programm-Schleifen werde ich nicht dupe?
- siehe stackoverflow.com/questions/1608181/...
- Wenn Sie nicht wollen, Duplikate, dann sind Sie nicht auf der Suche nach Zufälligkeit en.wikipedia.org/wiki/Randomness , klingt Sie suchen eine randomisierte mischalgorithmus en.wikipedia.org/wiki/Random_permutation
- Dank Maggie nach einer schnellen Lesen zu Schlurfen-ich denke, das ist der Algorithmus, der im suchen.
- Siehe stackoverflow.com/questions/196017/unique-random-numbers-in-o1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klingt es wie Sie wollen, mischen von ein-Satz eher als "echten" Zufall. Einfach ein array erstellen wo alle Positionen mit den Ziffern übereinstimmen, und initialisieren Sie einen Zähler:
Dann, Wann immer Sie wollen eine zufällige Zahl, verwenden Sie die folgende Methode:
Dies gibt einen zufälligen Wert aus einem stetig abnehmenden pool, garantiert keine Wiederholungen. Sie müssen Vorsicht von der pool läuft auf null-Größe natürlich und intelligent re-initialisiert den pool.
Dies ist eine deterministische Lösung als das halten einer Liste der verwendeten zahlen-und Weiterbildung zu Durchlaufen, bis Sie eine finden, die nicht in dieser Liste. Die Leistung, die Art des Algorithmus beeinträchtigen, da der pool kleiner wird.
Einer C-Funktion mit statischen Werten, so etwas sollte den trick tun. Rufen Sie es mit
um die pool-up (mit jeder Zahl von null oder größer die Größe angeben) oder
um die nächste Nummer aus dem pool (eine negative Zahl genügt). Wenn die Funktion nicht genügend Speicher, wird es wieder -2. Wenn es keine zahlen mehr in den pool, es wird -1 zurückgeben (an welcher Stelle könnte man re-initialisieren Sie den pool, wenn Sie wollen). Hier ist die Funktion mit einem unit-testing main für Sie zum ausprobieren:
Und hier ist die Ausgabe eines run:
Beachten Sie, dass, weil es nutzt die Statik, ist es nicht sicher für den Aufruf von zwei verschiedenen Orten, wenn Sie wollen, um Ihre eigenen pools. Wenn das der Fall ist, die Statik würde ersetzt werden durch einen Puffer (holding zählen und pool), das wäre "gehören" den Aufrufer (ein Doppel-Zeiger weitergegeben werden konnten, die in für diesen Zweck).
Und, wenn Sie schauen, für die "multiple-pool" - version, die ich hier der Vollständigkeit halber.
Wie Sie sehen können aus der veränderten
main()
, müssen Sie zuerst initialisierenint
Zeiger aufNULL
dann übergeben Sie die Adresse dermyRandom()
Funktion. Dies ermöglicht es jedem client (Stelle im code) haben Ihren eigenen pool, die automatisch reserviert und freigegeben, obwohl Sie könnte noch pools freigeben, wenn Sie möchten.Könnten Sie Format-Preserving Encryption zum verschlüsseln einen Zähler. Ihre Zähler geht von 0 nach oben, und die Verschlüsselung verwendet einen Schlüssel Ihrer Wahl, um Sie in einer scheinbar zufälligen Wert, was radix und Breite, die Sie wollen.
Blockchiffren haben in der Regel eine Feste Blockgröße von z.B. 64 oder 128 bit. Aber Format-Preserving Encryption ermöglicht es Ihnen, eine standard-cipher wie AES und eine kleinere Breite der Ziffer, von welchem radix und Breite, die Sie möchten (z.B. radix-2, Breite 16), mit einem Algorithmus, der noch kryptographisch robust.
Wird es garantiert nie Kollisionen (weil kryptographische algorithmen erstellen eine 1:1-Zuordnung). Es ist auch reversibel (eine 2-Wege-mapping), so können Sie die resultierende Zahl und wieder zurück zu den Zähler-Wert mit dem Sie angefangen haben.
AES-FFX ist eine vorgeschlagene standard-Methode, dies zu erreichen. Ich habe experimentierte mit einigen grundlegenden Python-code, der auf der Grundlage der AES-FFX Idee, wenn auch nicht in vollem Umfang überein--siehe Python code hier. Es kann z.B. verschlüsseln, gegen eine random-Suche 7-stelligen dezimal-Zahl, oder eine 16-bit-Zahl.
Müssen Sie zu verfolgen die zahlen, die Sie schon genutzt haben (beispielsweise in einem array). Holen Sie sich eine zufällige Zahl, und verwerfen es, falls es bereits verwendet wurde.
Ohne sich auf externe stochastische Prozesse wie den radioaktiven Zerfall oder eine Benutzereingabe, die Computer werden immer erzeugen von Pseudo-zufälligen zahlen -, dass die zahlen, die haben viele von den statistischen Eigenschaften der Zufallszahlen, aber wiederholen Sie in Sequenzen.
Dieser erklärt, die Vorschläge zu randomise der den Ausgang des Computers durch das mischen.
Verwerfen, die zuvor verwendeten zahlen kann, verlängern sich die Sequenz künstlich, aber auf Kosten der Statistiken, die den Eindruck von Zufälligkeit.
Der beste Weg, dies zu tun ist, erstellen Sie ein array für die zahlen, die bereits verwendet. Nachdem eine zufällige Zahl erstellt wurde, fügen Sie es in das array. Dann, wenn Sie gehen zu erstellen, die eine zufällige Zahl, sicherzustellen, dass es nicht in dem array der verwendeten zahlen.
Neben der Verwendung von Sekundär-array zum speichern der bereits generierten Zufallszahlen, aufrufen von random-no. seeding-Funktion vor jedem Aufruf von random. - Nr. generation-Funktion könnte helfen zu generieren unterschiedliche seq. der Zufallszahlen in jedem Lauf.