![]() |
Shuffle eines Strings
Hallo,
ich habe ein Problem, was ich nicht wirklich zu lösen weis. Ich habe einen String der 36 Zeichen lang ist. In dem String ist jedes Zeichen nur einmal vorhanden (A-Z, 0-9). Ich möchte, dass die Reihenfolge der Ziffern jetzt gemischt wird, und zwar über einen Parameter. Wichtig ist, dass wenn ich z.B. Parameter 1 übergebe, das sich immer die gleiche Reihenfolge bekomme. Das gleiche für Parameter 2,3 bis X (maximale Anzahl an Kombinationen). Hat jemand eine Idee für so einen Algo? Oliver |
Re: Shuffle eines Strings
Dir ist klar, dass es da etwa 3,72*10^41 Möglichkeiten gibt? Ein Unsigned Int64 hat nur einen Maximalwert von etwa 1,844*10^19 .
Wenn du also nicht zusätlich noch eine BigInt Implementierung verwenden wilst, musst du dir allein für den parameter etwas einfallen lassen. |
Re: Shuffle eines Strings
Ist die Frage, ob die Kombination eindeutig sein muss, sodass man auf den Urstring rückschließen kann, oder ob das ganze wie eine Art Hash funktionieren soll.
|
Re: Shuffle eines Strings
Zitat:
Zitat:
|
Re: Shuffle eines Strings
Du brauchtst einen eigenen Zufallsgenerator. Er nuss nicht besonders gut sein. Es reicht ein Generator nach der linearen Konkruenzmethode.
Delphi-Quellcode:
Warum nicht Random() benützen ? Weil Borland den random() Generator ändern könnte.
var
g_seed:integer; function fastrand:integer; // "geklaut" von [url]http://softwarecommunity.intel.com/articles/eng/2978.htm[/url] begin g_seed := 214013*g_seed+2531011; result := (g_seed shr 16) and $7FFF; end; Ausserdem wäre das nicht portabel. Keine Ahnung, ob FreePascal die gleiche random() Funkt benützt als Borland. Und dann einfach 36 Mal die Zeichen vertauschen:
Delphi-Quellcode:
g_Seed := deinIntParameter;
for i:=1 to 36 do begin // swapChar vertauscht zwei Chars - deine Hausaufgabe SwapChar(s[i], s[fastrand mod 36 +]); end; |
Re: Shuffle eines Strings
Hi, danke!
Geht perfekt. Aber mich würde interessieren, ob die Zahle 214013 + 2531011 Zufall sind, oder genau das machen, was ich will, nämlich keine doppelte Kombi erzeugen. |
Re: Shuffle eines Strings
Zitat:
Wenn's dich interessiert, dann kannst du ja mal einen Test fahren:
Delphi-Quellcode:
Wenn du das array graphisch auswertest, sollte überall *ungefähr* 10 drinstehen.
var rcounter: array[0..32767] of Word;
for i := 1 to 32768*10 do begin Inc(rcounter[fastrand]); end; |
Re: Shuffle eines Strings
Deine Anzahl von Kombinantionen ist jedoch auf die Periodenlänge des Zufallsgenerators beschränkt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz