Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Buchstaben eines Strings zufällig anordnen
matze4all - Do 07.04.05 22:10
Titel: Buchstaben eines Strings zufällig anordnen
Hallo,
ich probiere ein Ratespiel zu programmieren (in Delphi 2005), wo ein Wort eingegeben wird und das Programm die
Buchstaben des Wortes zufällig vertauscht, sodass man es halt erraten muss....
soweit sogut....nur leider ist bis jetzt alles schief gegangen und ich hoffe mir kann jemand helfen :P
Der Funktion-Anfang (ein Wort wird übergeben)....
Delphi-Quelltext
1: 2: 3: 4:
| function TForm1.buchstabentausch(wort:string):string; Begin End; |
Hat jemand eine Idee, wie man das machen könnte??
(Ich hatte das mit randomize; und random() probiert, nur leider ging's zum Schluss nicht auf :roll: )
Mfg,
Matze
PS: Ich hoffe, dass ist das richtige Unterforum, ich bin neu hier und Blick noch nicht ganz durch -.-
PS2: verdammt, hab wohl doch das falsche Unterforum gewählt -.- sry
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
Moderiert von
Christian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Do 07.04.2005 um 22:27
der_zaehe - Do 07.04.05 22:30
erstemal: :welcome: !
wie wärs damit?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function TForm1.buchstabentausch(wort:string;Wiederholungen:integer):string; var zahl1,zahl2 : Integer; puffer : char; Begin for i := 0 to Wiederholungen do begin Randomize; zahl1 := Random(Length(wort)+1); while zahl1 = 0 do zahl1 := Random(Length(wort)+1); zahl2 := Random(Length(wort)+1); while zahl2 = 0 do zahl2 := Random(Length(wort)+1); puffer := wort[zahl1]; wort[zahl1] := wort[zahl2]; wort[zahl2] := puffer; end; End; |
ist nicht getestet, ich hoff es geht :)
Kroni - Do 07.04.05 22:32
na ja...das mit Random und so ist gar keine schlecht idee....
du musst eben nur Zufällige Zahlen erzeugen...also wenn du zb vier zeichen hast....dann eben von 1-4 zufallszahlen erzeugen , und dann musste eben gucken, dass diese ZUfallszahl nicht doppelt auftritt.
Dies geht mit folgender Funktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function zufallarray(laenge:integer):array of integer; var kontrollarray:array [0..11] of boolean; i,zufall:integer;
begin for i:= 0 to (laenge-1) do begin kontrollarray[i]:=false; end; randomize; i:=0; while (i<=(laenge-1)) do begin zufall:=random(laenge); if (kontrollarray[zufall]=false) then begin zufallarr[i]:=zufall; kontrollarray[zufall]:=true; inc(i); end; end; result:=zufallarr; end; |
Änderst n bissl an dem Code...und dann bekommst du immer Zufallszahlen...wenn zb die laenge=4 erzuegt er dir z.B:
0231 oder 2310 oder sowas...
und damit kannste dann die Buchstaben vertauschen^^
guck dir einfach die Funktion an und überleg...;-)
matze4all - Do 07.04.05 22:41
der_zaehe hat folgendes geschrieben: |
erstemal: :welcome: ! |
Danke :P für die schnelle Antwort :P
naja, anstatt Wiederholungen, hab ich length() genommen und es geht :)
und unten noch "buchstabentausch := wort;" rangehängt :)
Kannst du mir zufällig noch in groben erklären, was passiert,
weil ich das wahrscheinlich mein Informatiklehrer erklären muss :roll:
wäre nett :) ein bisschen kann ich mir ja denken...
@ Kroni: Danke :) werde es auch gleich probieren :P
EDIT: hmm, mir ist aufgefallen, dass meine Idee so ähnlich war und das Problem
bei deiner Variante ist, dass das wort höchstens 11 Zeichen lang sein darf
(wegen "array [0..11]")...geht das nicht auch so: "kontrollarray:array [0..laenge]" ?
Kroni - Do 07.04.05 22:47
BEvor ich ins bett gehe und dann übers WE wegbin:
Du gibts ihm ne Länge vor...also, wie viele Zahlen der erzeugen soll.....
dann ist es ja möglich, wenn du vier Zahlen einfach mit random(4)erzuegst, ddass Zahlen doppelt vorkommen.....
das wird verhindert, indem du n Kontrollarray machst....der guckt dann, wenn du ne Zahl zufällig erzeugt hast, ob die Zahl schon erzeugt wurde...wenn nicht, zählt der um eins hoch, und sagt also...ich habe nun eine Zahl, die noch NICHT vorhanden war, speichert die dann an erster Stelle ab...und speichert das in dem Array of Boolean, dass die Zahl schon benutzt worden ist.
Dann geht er weiter....
Wenn ne Zahl schon erzeugt worden ist, erzeugt er einfach ne nächste Zufallszahl.....
Bis eben alle Zahlen erzeugt worden sind....;-)
EDIT: ja, das geht, indem du n dynamisches Array machst, und dann laenge übergibst, und du dann das Array per setlength(length) auf die länge setezt.....;-)
JayEff - Do 07.04.05 23:35
Dynamisches Array: einfach die [ x..y] weglassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var aArray: array of integer; begin setlength(aArray,10); aArray[0]:= aArray[1]:=
aArray[9]:= end; |
so wird das dann klappen, wenn ich mich nicht irre. (und das tue ich oft xD)
delfiphan - Fr 08.04.05 01:06
Das mit den Wiederholungen ist nicht völlig zufällig. Hier die Standardmethode, um eine zufällige Permutation von Elementen zu erzeugen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function scramble(const S: String): String; Var I, J, L : Integer; C: Char; begin Result := S; L := Length(Result); For I := 1 to L do begin J := I+random(L-I+1); C := Result[J]; Result[J] := Result[I]; Result[I] := C; end; end; |
matze4all - Fr 08.04.05 19:06
Danke für eure Antworten :P
Mir ist allerdings eben die Beste/Einfachste Idee gekommen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function TForm1.buchstabentausch(wort:string):string; var i,zufall: Integer; puffer,wort2: string; Begin For i:= 1 To length(wort) Do Begin randomize; zufall := random(length(wort))+1; puffer := wort[zufall]; delete(wort,zufall,1); wort2 := wort2 + puffer; End; buchstabentausch := wort2; End; |
oder sieht da jemand einen Fehler ?!?! Also bei mir gings bisher immer :)
delfiphan - Fr 08.04.05 22:10
Die beste Methode? Die Operation Delete und das Anhängen von Zeichen an einen Strings sind sehr langsame Operationen (unter Umständen wird bei dir pro Durchlauf ein FreeMem und ein GetMem/ReallocMem ausgeführt)
matze4all - Fr 08.04.05 22:47
hmmm, stimmt... wenn ich mir deine funktion angucke...ist doch die bessere Lösung :roll:
ich hatte nur letztens im Informatik-Unterricht die Funktion delete() gelernt und
da wollte ich die gleich mal mit einbauen :roll:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!