Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wörter zufällig wiederzusammensetzen (https://www.delphipraxis.net/157963-woerter-zufaellig-wiederzusammensetzen.html)

ProgrammiererMike 31. Jan 2011 17:14


Wörter zufällig wiederzusammensetzen
 
Hallo Leute!

Ich habe ein Programm, in dem man in ein Editfeld ein Wort eingeben kann. Es soll zufällig wiederzusammengesetzt werden. Ich hab das ganze so gemacht:

Delphi-Quellcode:
   for I := 1 to length(Eingabe) do begin
       AusgabeDurcheinanderArray[I] := copy(Eingabe,I,I);
   end;

   for I := 1 to length(Eingabe) do begin
       Zufall := trunc(random(length(Eingabe)))+1;
       if AusgabeDurcheinanderArray[Zufall] = '' then begin
          Zufall := trunc(random(length(Eingabe)))+1;
          AusgabeDurcheinanderBuchstabe := AusgabeDurcheinanderArray[Zufall];
          AusgabeDurcheinanderFertig := AusgabeDurcheinanderFertig+AusgabeDurcheinanderBuchstabe;
          AusgabeDurcheinanderArray[Zufall] := '';
       end else begin
          AusgabeDurcheinanderBuchstabe := AusgabeDurcheinanderArray[Zufall];
          AusgabeDurcheinanderFertig := AusgabeDurcheinanderFertig+AusgabeDurcheinanderBuchstabe;
          AusgabeDurcheinanderArray[Zufall] := '';
       end;
   end;
Zuerst lege ich jeden Buchstaben in ein Array. Dann bilde ich eine Zufallszahl, schau ob das Array leer ist (das Array des Buchstaben, denn ich bereits entnommen habe wird geleert) wenn es leer ist soll eine neue Zufallszahl gebildet werden und sonst soll einfach der Buchstabe des Arrays zu den anderen die bereits entnommen worden sind hinzufügen.

Mein Problem: es werden manche buchstaben doppelt und manche gar nicht herausgenommen, dann wird aus einem wort wie hallo gleich mal llloh

Was mach ich falsch?

Mit freundlichen Grüßen

ProgrammiererMike

Bummi 31. Jan 2011 17:22

AW: Wörter zufällig wiederzusammensetzen
 
http://www.delphipraxis.net/157708-t...her-yates.html

ProgrammiererMike 31. Jan 2011 17:44

AW: Wörter zufällig wiederzusammensetzen
 
Danke für die Verlinkung...aber geht das nicht so wie ichs gemacht habe...weil ich glaub nicht, dass ich meinem Professor so etwas kKompliziertes wie Fisher-Yates präsentieren kann.

Aphton 31. Jan 2011 17:56

AW: Wörter zufällig wiederzusammensetzen
 
Zitat:

Zitat von ProgrammiererMike (Beitrag 1078607)
Hallo Leute!

Ich habe ein Programm, in dem man in ein Editfeld ein Wort eingeben kann. Es soll zufällig wiederzusammengesetzt werden. Ich hab das ganze so gemacht:

Delphi-Quellcode:
   for I := 1 to length(Eingabe) do begin
       AusgabeDurcheinanderArray[I] := copy(Eingabe,I,I);
   end;

   for I := 1 to length(Eingabe) do begin
       Zufall := trunc(random(length(Eingabe)))+1;
       if AusgabeDurcheinanderArray[Zufall] = '' then begin
          Zufall := trunc(random(length(Eingabe)))+1;
          AusgabeDurcheinanderBuchstabe := AusgabeDurcheinanderArray[Zufall];
          AusgabeDurcheinanderFertig := AusgabeDurcheinanderFertig+AusgabeDurcheinanderBuchstabe;
          AusgabeDurcheinanderArray[Zufall] := '';
       end else begin
          AusgabeDurcheinanderBuchstabe := AusgabeDurcheinanderArray[Zufall];
          AusgabeDurcheinanderFertig := AusgabeDurcheinanderFertig+AusgabeDurcheinanderBuchstabe;
          AusgabeDurcheinanderArray[Zufall] := '';
       end;
   end;
Zuerst lege ich jeden Buchstaben in ein Array. Dann bilde ich eine Zufallszahl, schau ob das Array leer ist (das Array des Buchstaben, denn ich bereits entnommen habe wird geleert) wenn es leer ist soll eine neue Zufallszahl gebildet werden und sonst soll einfach der Buchstabe des Arrays zu den anderen die bereits entnommen worden sind hinzufügen.

Mein Problem: es werden manche buchstaben doppelt und manche gar nicht herausgenommen, dann wird aus einem wort wie hallo gleich mal llloh

Was mach ich falsch?

Mit freundlichen Grüßen

ProgrammiererMike

Erstens einmal, ist diese Zeile hier unfug:
Delphi-Quellcode:
  for I := 1 to length(Eingabe) do
  begin
    AusgabeDurcheinanderArray[I] := copy(Eingabe,I,I);
  end;

// Besser
  Move( Eingabe[1], AusgabeDurcheinanderArray[1], Length( Eingabe ) ); {ich nehme an, Ausgabe...Arr = [1..<x>] of Char}
Weiters, zum eigentlichen Problem:
Delphi-Quellcode:
          Zufall := trunc(random(length(Eingabe)))+1; // WAS WENN Array[ZUFALL] WIEDER = ''?
          AusgabeDurcheinanderBuchstabe := AusgabeDurcheinanderArray[Zufall];
Mein Ansatz (hab deinen in geistiger Abwesendheit überflogen):
- erstelle ein Resultstring mit gleicher Länge (wie Eingabe)
- erstelle ein Array[0..Länge-1] mit den Werten {1,2,...,Länge) // zufArr
- initialisiere eine Index Variable mit 0 (zb. i)
- solange das Array Elemente besitzt, mache folgendes...
-- inkrementiere die Index Variable
-- wähle eine Zufallszahl im Bereich von 0..High(Array) und speichere in Variable (x) // Random(Length(zufArr))
-- weise dem Resultstring an der Stelle i den Wert Eingabe[zufArr[x]] zu
-- lösche den Wert aus dem Array

ProgrammiererMike 31. Jan 2011 18:06

AW: Wörter zufällig wiederzusammensetzen
 
Ich bin noch nicht so lange am Programmieren, was ist ein Resultstring, Indexvariable...irgenwie bin ich gerade ausgestiegen...

Aphton 31. Jan 2011 18:27

AW: Wörter zufällig wiederzusammensetzen
 
Das sind Wörter, mit denen ich diese Variablen beschrieben habe!
Ein Result ist der Rückgabewert bei einer Funktion!
Ein Index gibt eine Stelle an!

Sir Rufo 31. Jan 2011 19:01

AW: Wörter zufällig wiederzusammensetzen
 
Zitat:

Zitat von ProgrammiererMike (Beitrag 1078617)
Danke für die Verlinkung...aber geht das nicht so wie ichs gemacht habe...weil ich glaub nicht, dass ich meinem Professor so etwas kKompliziertes wie Fisher-Yates präsentieren kann.

:shock: für was ist der Prof.? Baumschule?
Ein Algorithmus mit einer Handvoll Zeilen ist zu kompliziert?
Wobei effektiv nur Random benutzt wird?

Ich brech zusammen ...

Bevor noch einer denkt ich Spinne rum, das ist dieser hochkomplizierte Fisher-Yates, den der Prof. angeblich nicht verstehen soll
Delphi-Quellcode:
procedure FisherYatesShuffle(x:TStrings);
  var
     i : Integer;
  begin
     for i := x.Count-1 downto 1 do
        x.Exchange(i, random(i+1));
  end;

Aphton 31. Jan 2011 20:32

AW: Wörter zufällig wiederzusammensetzen
 
Es klingt komplizierst, ist es aber tatsächlich nicht.
Jenes gilt für alles!
Dh. es ist relativ zu sehen. Was für dich einfach ist, kann für einen anderen schwer sein und vice versa!

@ThreadStarter
Fisher-Yates's Verfahren ist am angebrachtesten aber wenn du es selbst machen willst und noch nicht so bewandert bist, dann gehe so vor, wie ich es beschrieben habe!
Besser wärs natürlich wenn du dich mit den Funktionen (random, exchange) in dem oben genannten Verfahren auseinandersetzt und es so verstehst!

ProgrammiererMike 1. Feb 2011 13:17

AW: Wörter zufällig wiederzusammensetzen
 
Sache hat sich so eben erledigt...habs geschafft...danke für eure Ratschläge...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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