Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zufallswörter (https://www.delphipraxis.net/57457-zufallswoerter.html)

Wargrave 21. Nov 2005 18:03


Zufallswörter
 
Halli Hallo!
Ich bin gerade am raten.
Das kann doch garnich so schwer sein so etwas zu programmieren aber ich kriegs einfach net hin!
Ich habe 9 Buchstaben zur verfügung U R L T K A D P E .
Aus diesen Chars soll man ein Wort bilden.
Meine Synapsen reichen dafür ncih emrh aus.
Ich randomize mir hier einen zurecht aber kireg das ncih auf die reihe.
der soll alle buchstaben irgendwie kombinieren und in ne list box reinhauen!
dann guck man halt durch ob was vernünftiges dabei is.
So is der Plan.
Kann mir mal bitte einer en denkanstoß geben?
Mfg Patrick

Khabarakh 21. Nov 2005 18:11

Re: Zufallswörter
 
[wird überarbeitet *g*]

Waldteufel 21. Nov 2005 18:13

Re: Zufallswörter
 
Hi.

Mit Zufall hat das ja nicht unbedingt was zu tun... Du willst wohl eher alle Möglichkeiten durchprobieren, oder?

Ich würde es so machen (Pseudocode):

Code:
[b]Konstante[/b] Bv [i]{ Buchstabenvorrat }[/i] = ('U', 'R', 'L', 'T', 'K', 'A', 'D', 'P', 'E');
[b]Variable[/b] b1, b2, b3 [i]{, ...}[/i] ;

[b]für alle[/b] b1 [b]in[/b] Bv [b]tue[/b]
  [b]für alle[/b] b2 [b]in[/b] (Bv [b]ohne[/b] (b1)) [b]tue[/b]
    [b]für alle[/b] b3 in (Bv [b]ohne[/b] (b1, b2)) [b]tue[/b]
       [i]{ ... bis schlussendlich: }[/i]
         ZuListboxHinzufügen(NeuerString(b1, b2, b3, ...));

Nikolas 21. Nov 2005 18:15

Re: Zufallswörter
 
Hat dir dein Lehrer ein Wörerbuch gegeben, um die Worte auf Sinngehalt zu prüfen?

Bei den Buchstaben wird es das einfachste sein, einen String aus allen Zeichen zu nehmen und dann ein paar Mal zwei Buchstaben zufällig auszutauschen. Wenn du das ein paar Hundert mal machst, wirst du an alle Möglichkeiten kommen.
Wenn du alle Möglichkeiten brauchst, könntest du es so machen, dass du alle Permutationen der Zahlen 1-9 anzeigen lassen und die Zahlen dann durch Buchstaben ersetzen.

malo 21. Nov 2005 18:30

Re: Zufallswörter
 
Zitat:

Zitat von Toxman
Bei den Buchstaben wird es das einfachste sein, einen String aus allen Zeichen zu nehmen und dann ein paar Mal zwei Buchstaben zufällig auszutauschen. Wenn du das ein paar Hundert mal machst, wirst du an alle Möglichkeiten kommen.

Gibt es denn nicht nur 81 (9*9) Möglichkeiten, wie die Buchstaben angeordnet sind? Oder vertu ich mich da gerade? :gruebel:

Denn, wieso "ein paar hundert Mal" machen, wenn 81 mal reichen?

Wenn man trotzdem Zufall einbauen will, sollte man auch Buchstaben zufällig austauschen. Dabei aber bekannte Kombinationen merken und ausschließen ;)

Neutral General 21. Nov 2005 18:35

Re: Zufallswörter
 
Zitat:

Zitat von malo
Zitat:

Zitat von Toxman
Bei den Buchstaben wird es das einfachste sein, einen String aus allen Zeichen zu nehmen und dann ein paar Mal zwei Buchstaben zufällig auszutauschen. Wenn du das ein paar Hundert mal machst, wirst du an alle Möglichkeiten kommen.

Gibt es denn nicht nur 81 (9*9) Möglichkeiten, wie die Buchstaben angeordnet sind? Oder vertu ich mich da gerade? :gruebel:

Denn, wieso "ein paar hundert Mal" machen, wenn 81 mal reichen?

Wenn man trotzdem Zufall einbauen will, sollte man auch Buchstaben zufällig austauschen. Dabei aber bekannte Kombinationen merken und ausschließen ;)

Klar aber es kann auch mal sein das Kombinationen doppelt vorkommen ;)

St.Pauli 21. Nov 2005 18:38

Re: Zufallswörter
 
Zitat:

Zitat von Neutral General
Klar aber es kann auch mal sein das Kombinationen doppelt vorkommen ;)

Dann müsste man die Wörter, die schon erstellt wurden alle bei jedem Hinzufügen durchgehen. Wenn es schon existiert, das ganze Wort nochmal neu erstellen,...

alzaimar 21. Nov 2005 18:39

Re: Zufallswörter
 
Stichwort: Permutationen. Benutze die Suchfunktion hier oder im Delphi-Forum. Ich (und Andere) haben uns darüber ausgelassen.

cruso 21. Nov 2005 18:44

Re: Zufallswörter
 
Zitat:

Zitat von Waldteufel
Code:
[b]Konstante[/b] Bv [i]{ Buchstabenvorrat }[/i] = ('U', 'R', 'L', 'T', 'K', 'A', 'D', 'P', 'E');
[b]Variable[/b] b1, b2, b3 [i]{, ...}[/i] ;

[b]für alle[/b] b1 [b]in[/b] Bv [b]tue[/b]
  [b]für alle[/b] b2 [b]in[/b] (Bv [b]ohne[/b] (b1)) [b]tue[/b]
    [b]für alle[/b] b3 in (Bv [b]ohne[/b] (b1, b2)) [b]tue[/b]
       [i]{ ... bis schlussendlich: }[/i]
         ZuListboxHinzufügen(NeuerString(b1, b2, b3, ...));

Das müsste eigentlich funktionieren!

Duffy 21. Nov 2005 18:55

Re: Zufallswörter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Patrick,
ein Denkanstoss wäre das anhängende Beispiel, aber es sind Zufallswörter, die keinen Sinn ergeben ...

bye
Claus

Nikolas 21. Nov 2005 18:55

Re: Zufallswörter
 
Zitat:

Gibt es denn nicht nur 81 (9*9) Möglichkeiten, wie die Buchstaben angeordnet sind? Oder vertu ich mich da gerade?
Du vertust dich gerade :)

Für den ersten Buchstaben hast du die volle Auswahl von 9 Zeichen, für den nächsten nur noch 8, dann 7 usw. Das gibt dann einen Ausdruck der Art 9*8*7*...*1=9! (9 Fakultät).
9!=362880 :mrgreen:

omata 21. Nov 2005 19:04

Re: Zufallswörter
 
Moin,

habe mich auch mal dran versucht...

Delphi-Quellcode:
procedure TForm.ButtonClick(Sender: TObject);
var KombiListe:TStringList;
begin
  KombiListe:=TStringList.Create;
  try
    kombi(KombiListe, 'abc');

    // KombiListe enthält nun die Elemente

  finally
    KombiListe.free;
  end;
end;

procedure TForm.kombi(Liste:TStrings; variable:string; fest:string = '');
var i:integer;
begin
  if length(variable) > 2 then begin
    for i:=1 to length(variable) do begin
      kombi(Liste,
            copy(variable, 1, i-1) + copy(variable, i+1, length(variable)),
            fest + variable[i]);
    end;
  end
  else begin
    if length(variable) > 0 then
      Liste.Append(fest + variable);
    if length(variable) > 1 then
      Liste.Append(fest + variable[2]+variable[1]);
  end;
end;
Aber vorsicht bei langen Worten, dass kann dauern.
Wobei lang hier schon eine Zeichenkette mit 8 Zeichen ist!

MfG
Thorsten

alzaimar 21. Nov 2005 19:11

Re: Zufallswörter
 
So gehts:
Delphi-Quellcode:
Function NthPermutation (const aString : AnsiString; aCount : Integer) : AnsiString;
Var
  pos, i, n : Cardinal;
  chTemp : char;
Begin
  n := Length(aString);
  result := aString;

  for i := n downto 2 do
    begin
    pos := acount mod i +1;
    //switch
    chTemp := result[i];
    result[i] := result[Pos];
    result[Pos] := chTemp;

    acount := acount div i;
    End;
End;

Procedure TForm1.Button1Click (Sender : TObject);
Const
  sLetters = 'URLTKADPE';
  f : Integer;
Begin
  f := 1;
  For i:=2 To Length (sLetters) do f:=f*i;
  For i:=1 to f-1 do memo1.lines.add (NthPermutation (sLetters,i));
End;
Optimal ist es nicht, da die Funktion 'NthPermutation' die N.te Permutation einer Zeichenkette liefert und jedesmal von vorne anfängt, zu mischen. Aber egal.

omata's version verwendet Rekursion, die hier mischt den String jedesmal nach einem festgelegten Muster.

3_of_8 21. Nov 2005 19:14

Re: Zufallswörter
 
@Toxman: Bei doppelten Kombinationen sind es sogar 9^9 Möglichkeiten, also 387420489 Möglichkeiten. Ein Bissel viel für ne Listbox, oder? Der arme User...

omata 21. Nov 2005 19:17

Re: Zufallswörter
 
@alzaimar:

Bei nur einem Zeichen kommt bei deiner Variante keine Möglichkeit heraus.
Bei zwei Zeichen nur 1 Möglichkeit.
Bei drei Zeichen nur 5 Möglichkeiten.

irgendwie fehlt da immer eine, oder übersehe ist da jetzt was?

Ausserdem sehe ich gerade das da das Schlüsselwort var fehlt und die Variablendeklaration von i.
besser ist...
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
Const
  sLetters = 'URLTKADPE';
var f,i : Integer;
Es werden zusätzlich auch noch Warnungen ausgeschmissen.
besser ist...
Delphi-Quellcode:
Function NthPermutation (const aString : AnsiString; aCount : Cardinal) : AnsiString;
Warum Integer, wenn negative Zahlen nicht vorkommen können?


MfG
Thorsten

alzaimar 22. Nov 2005 07:42

Re: Zufallswörter
 
Hupsa: Das war spät, gestern, so gehts aber:
Delphi-Quellcode:
Var
  i, f : Integer;
Begin
  f := 1;
  For i :=2 To Length (sLetters) do f:=f*i;
  For i:=0 to f-1 do memo1.lines.add (NthPermutation (sLetters,i));
End;

joel93 24. Jul 2006 17:37

Re: Zufallswörter
 
Ich hab was gefunden, wo man der permutation per word ne rechtschreibprüfung unterziehen kann:
Rechtschreibprüfung (ich glaub 10. von oben)


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