Aktueller Standort: Startseite> Neueste Artikel> Wie man vermeidet, dass Str_Shuffle () doppelte Charakterkombinationen erzeugt

Wie man vermeidet, dass Str_Shuffle () doppelte Charakterkombinationen erzeugt

gitbox 2025-05-29

Die Str_Shuffle -Funktion in PHP wird häufig verwendet, um die Abfolge von Zeichenfolgen zufällig zu stören und verschiedene zufällige Permutationen zu erzeugen. Es ist sehr einfach zu bedienen, wie:

 <?php
$original = "abcdef";
$shuffled = str_shuffle($original);
echo $shuffled;
?>

Jedes Mal, wenn dieser Code ausgeführt wird, gibt er eine zufällige Permutationskombination der ursprünglichen Zeichenfolge zurück. In einigen Anwendungsszenarien möchten wir jedoch, dass die generierten zufälligen Kombinationen nicht wiederholt werden, z. B. Verifizierungscodes, zufällige Kennwörter, Lotteriesequenzen usw.

Aufgrund der zufälligen Natur von str_shuffle ist es jedoch immer noch möglich, jedes Mal, wenn Sie anrufen, dieselbe Permutation zu erzeugen, insbesondere wenn die Stichprobengröße gering ist oder die Anzahl der Anrufe groß ist, die Wahrscheinlichkeit der Duplikation erhöht sich erheblich. Wie kann man also vermeiden, doppelte Zeichenkombinationen zu erzeugen? Hier sind einige praktische Strategien.


1. Verwenden Sie Arrays, um generierte Kombinationen zu speichern, um eine Duplikation zu vermeiden

Die intuitivste Methode besteht darin, eine neue zufällige Zeichenfolge zu generieren und in einem Array oder einer Sammlung zu speichern. Überprüfen Sie bei der Erzeugung einer neuen Zeichenfolge, ob sie bereits existiert, und regenerieren Sie sie, wenn sie existiert.

 <?php
$original = "abcdef";
$generated = [];

function generateUniqueShuffle($str, &$history) {
    do {
        $shuffled = str_shuffle($str);
    } while (in_array($shuffled, $history));
    
    $history[] = $shuffled;
    return $shuffled;
}

// Beispiel:erzeugen10Eine einzigartige zufällige Kombination
for ($i = 0; $i < 10; $i++) {
    echo generateUniqueShuffle($original, $generated) . "\n";
}
?>

Diese Methode ist einfach, aber wenn die Anzahl der Generationen zunimmt, wird die Doppelspurung langsamer und erzeugt möglicherweise weniger als die gewünschte Zahl (begrenzte Kombinationen).


2. in voller Anordnung vorgeneriert und nach Bedarf zufällig ausgewählt

Alle Zeichenfolgen sind begrenzt (Länge und Na. -Permutationen haben N! Sie können zuerst einen rekursiven Algorithmus verwenden, um alle Permutationen zu erstellen, sie zu speichern und sie dann zufällig von ihnen zu extrahieren und zu widmen.

Das Beispiel generiert einen vollständig arrangierten Kerncode:

 <?php
function permute($str, $prefix = '') {
    $result = [];
    $len = strlen($str);
    if ($len == 0) {
        $result[] = $prefix;
    } else {
        for ($i = 0; $i < $len; $i++) {
            $rem = substr($str, 0, $i) . substr($str, $i + 1);
            $result = array_merge($result, permute($rem, $prefix . $str[$i]));
        }
    }
    return $result;
}

$original = "abc";
$allPermutations = permute($original);
shuffle($allPermutations); // Zufällige Störungsreihenfolge

foreach ($allPermutations as $perm) {
    echo $perm . "\n";
}
?>

Diese Methode eignet sich für kurze Stringlängen (normalerweise weniger als 8), da die Anzahl der vollständigen Permutationen explodiert (8! = 40320), was viel Speicher und Zeit verbraucht.


3. Generieren Sie den Status mithilfe von Hash- oder Datenbankdatensätzen

Wenn Sie eine Doppelarbeit über das gesamte Anfragen hinweg oder lange Zeit vermeiden müssen, können Sie die generierte Kombination in der Datenbank oder im Cache (wie z. B. Redis) aufzeichnen und prüfen, ob sie nach jeder Generation dupliziert ist, und dann entscheiden, ob sie zurückgegeben werden sollen.

Diese Methode ist in Umgebungen mit mehreren Benutzern oder bei der Erzeugung großer Chargen von zufälligen Kombinationen sehr praktisch, vermieden übermäßige Speicherverwendung und die Gewährleistung der Einzigartigkeit.

Beispiel Pseudocode -Ideen:

 <?php
// Stellen Sie eine Verbindung zur Datenbank her,Fragen Sie ab, wenn die aktuelle Kombination bereits vorhanden ist
// Wenn es gibt,则重新erzeugen,直到erzeugen唯一组合
// Fügen Sie die neue Kombination zum Speichern in die Datenbank ein
?>

Die spezifische Implementierung hängt vom Datenbanksystem und den von Ihnen verwendeten Geschäftsanforderungen ab.


4. Verwenden Sie zufälligen Störungen + Teilschiffersatz, um die Zufälligkeit zu erhöhen

Wenn Sie einfach eine einfache Wiederholung vermeiden, können Sie auch Str_Shuffle und zufälligen Zeichenersatz kombinieren, um den zufälligen Raum zu erhöhen. Ersetzen Sie beispielsweise nach einer Störung zufällig einige der Zeichen in den anderen zulässigen Zeichensätzen.

Dies verringert die Wahrscheinlichkeit einer Wiederholung, ist jedoch nicht garantiert, dass sie absolut einzigartig ist.


Zusammenfassen

  • Kleine und einfache Szenarien : Speichern Sie die generierten Ergebnisse mit einem Array, und die Erkennung von Schleifen vermeidet die Duplikation.

  • Mittelgroße und kurze Saiten : vorgenerierte volle Permutationen, zufällig gezeichnet;

  • Groß- und dauerhafte Einzigartigkeit : Verwenden Sie Datenbanken oder Caches, um Datensätze zu deduplizieren.

  • Verbesserte Zufälligkeit : Verringern Sie die Wahrscheinlichkeit der Wiederholung in Kombination mit anderen zufälligen Transformationsmethoden.

Bei der Auswahl einer Strategie müssen Sie die Stringlänge, die Anzahl der Generationen, die Leistung und den Speicherverbrauch abwägen und eine vernünftige Lösung entwerfen.