AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Shuffle eines Strings

Ein Thema von backdraft · begonnen am 29. Mär 2008 · letzter Beitrag vom 29. Mär 2008
Antwort Antwort
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#1

Shuffle eines Strings

  Alt 29. Mär 2008, 00:25
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 00:43
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 00:45
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.
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 01:40
Zitat von cruiser:
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.
Jo ist mir klar Ich will ja auch nicht alle Möglichkeiten haben, sondern 2^32 Kombinationen (Integer) haben, die aber immer ungleich einer anderen ist.

Zitat von NamenLozer:
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.
Einen Rückschluss brauche ich nicht. Wichtig ist nur, dass die Ziffern nicht doppelt sind, und keine andere dazubekommen sind. Also wirklich nur mischen.
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 02:26
Du brauchtst einen eigenen Zufallsgenerator. Er nuss nicht besonders gut sein. Es reicht ein Generator nach der linearen Konkruenzmethode.
Delphi-Quellcode:
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;
Warum nicht Random() benützen ? Weil Borland den random() Generator ändern könnte.
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;
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
335 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 02:45
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.
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 04:31
Zitat von backdraft:
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.
Die Zahlen sind speziell ausgesucht, um eine möglichst lange Periodenlänge des Generators zu erhalten.
Wenn's dich interessiert, dann kannst du ja mal einen Test fahren:
Delphi-Quellcode:
var rcounter: array[0..32767] of Word;

for i := 1 to 32768*10 do
begin
  Inc(rcounter[fastrand]);
end;
Wenn du das array graphisch auswertest, sollte überall *ungefähr* 10 drinstehen.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#8

Re: Shuffle eines Strings

  Alt 29. Mär 2008, 12:07
Deine Anzahl von Kombinantionen ist jedoch auf die Periodenlänge des Zufallsgenerators beschränkt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz