String per Zufallsprinzip generieren

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
phpdan
Mitglied
Beiträge: 2
Registriert: 17.05.2008 16:00

String per Zufallsprinzip generieren

Beitrag von phpdan »

hi,
ich habe eine Frage, nähmlich: ich will einen String zufällig generieren lassen. Dabei habe ich das Problem, dass ich alle möglichen Kombinationen in eine Datei speichern möchte. Bei 11 Zeichen macht das genau 39916800 Möglichkeiten. wenn ich es so programmieren würde, dass es bei einem buttonklick 1 Möglichkeit generiert, wär ich lange damit beschäftigt, auf den button zu klicken, damit ich alle Möglichkeiten durchab ;). daher habe ich es so gemacht, dass ich es solange durchlaufen lasse, bis alle Möglichkeiten in der Datei gespeichert worden sind. Die einzelnen Buchstaben sind dabei in einem Array abgelegt.
Leider dauert es jetzt sehr lange beim Ausführen von dem Script ^^

könntet ihr mir helfen, wie man es einfacher/schneller machen könnte?
wenn irgendwas nicht deutlich wird, oder ihr noch Fragen habt, sagt es/fragt einfach ;)

Danke schonmal im Vorraus :)
mfg phpdan

Den Quellcode findet ihr
hier.
Zuletzt geändert von phpdan am 06.07.2008 14:27, insgesamt 1-mal geändert.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Eigentlich geht das doch ziemlich einfach, eine vollkommen zufällige Buchstabenkombination zu erzeugen?? Es gibt 26 Buchstaben (oder noch ein paar mehr, wenn du auch Sonderzeichen und Zahlen drin haben willst, oder zwischen Groß/Kleinschreibung unterscheidest).

Die schreibst du alle in einen String in einer beliebigen Reihenfolge (vermutlich am besten Sortiert, so dass du keinen vergisst).

Dann benutzt du [php:rand], [php:mt_rand] oder ähnliches um einfach zufällig einen Buchstaben zu bestimmen und zwar so häufig, wie lang das Wort sein soll (also 11 mal bei 11 Buchstaben) und wählst jeweils den Index der Zahl, die bestimmt wurde und nimmst den zugehörigen Buchstaben des Strings per [php:substr]. Dann setzt du die Buchstaben zusammen und hast dein Wort ohne ein festplattenfüllendes Array benutzen zu müssen, besonders langsam dürfte es eigentlich auch nicht sein.

Wenn du unbedingt alle Möglichkeiten speichern musst, dann solltest du allerdings anders vorgehen, denn bei zufällig generierten Strings besteht natürlich die Möglichkeit (und die Chance wächst von String zu String) dass du einen doppelt in der Liste aufnimmst. Da solltest du auf jeden Fall dann sortiert generieren und iterativ erst aaaaa....a, dann aaaa...b aaaa...c usw. verwenden. Das kannst du - sofern auch Zahlen vorkommen dürfen - auch per [php:base_convert] realisieren, hier kannst du einen Zähler hochlaufen lassen bis zum theoretischen Maximum und dann alle generierten Zahlen auf eine Basis von 26 + 10 = 36 konvertieren wo dann alle Buchstaben von a bis z und die Ziffern 0 bis 9 drin vorkommen würden.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
phpdan
Mitglied
Beiträge: 2
Registriert: 17.05.2008 16:00

Beitrag von phpdan »

hi,
danke für die schnelle antwort - aber es ging nicht dadrum, einen String aus irgendwelchen buchstaben oder zahlen zu erstellen, sondern aus 11 festgelegten. Und was das doppelt abspeichern angeht: das hab ich unterbunden ;) mein einziges problem ist also nur, dass es so lange dauert ;)

mfg phpdan

edit: nicht 11 sondern nur 10 Buchstaben
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

phpdan hat geschrieben:hi,
danke für die schnelle antwort - aber es ging nicht dadrum, einen String aus irgendwelchen buchstaben oder zahlen zu erstellen, sondern aus 11 festgelegten. Und was das doppelt abspeichern angeht: das hab ich unterbunden ;) mein einziges problem ist also nur, dass es so lange dauert ;)

mfg phpdan

edit: nicht 11 sondern nur 10 Buchstaben
Naja gut, ob die Generierung jetzt aus 36 oder aus 11 / 10 Buchstaben erfolgt ist relativ egal für den ersten Teil meines Posts.

Ansonsten wäre es auch möglich wieder Zahlen hochzuzählen und dann per [php:base_convert] in die Basis deiner Buchstaben umzurechnen. Jeder Buchstabe/Zahl in der umgerechneten Zahl entspricht einem Buchstaben aus deinem Set. Dann musst du nur noch entsprechend ersetzen und hast systematisch alle Wörter abgedeckt.
Also konkret:

Code: Alles auswählen

$buchstaben = "ABCDEFGHIJKL";
$laenge = strlen($buchstaben);
$wortlaenge = 10;
for($i = 0; $i < 10000; $i++)
{
	$zahl = base_convert($i, 10, $laenge);
	$wort = '';
	for($j = 0; $j < strlen($zahl); $j++)
	{
		$buchstabe = base_convert($zahl{$j}, $laenge, 10);
		
		$buchstabe = $buchstaben{$buchstabe};
		$wort = $wort . $buchstabe;
	}
	//Wort mit Nullen von vorne Auffüllen:
	for($j = strlen($wort); $j < $wortlaenge; $j++)
	{
		$wort = $buchstaben{0} . $wort;
	}
	//Wort speichern (kannst du selber machen, aber nicht jedes Mal fopen und fclose, das Bremst tierisch ;) )
	echo "$wort <br>\n";
}
Da musst du nur noch geringe Änderungen dran vornehmen (z.b. die Anzahl der zu generierenden Worte, die Wortlänge, die Buchstaben und das Speichern). Wenn du das Schrittweise machst (in der for Schleife die Start- und Endwerte anpassen), dann solltest du damit ohne Probleme alle benötigten Bereiche abdecken und speichern können.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“