[PHP] Zufallswerte generieren

hurzelfurzel

Well-known member
8 Juni 2006
141
15
Hallo!

ich müsste über PHP zufallswerte in z.B. dieser Form genereieren lassen:
YNCS5K

Habe nun einiges gesucht aber ich finde immer nur "Array zufällig anordnen" und "Zufallszahl ermitteln".

Kennt da jemand ne Lösung?

Danke schonmal
 
array_rand() sollte dir das gewünschte Resultat für eine Stelle liefern, wenn du vorher ein Array entsprechend mit allen möglichen Zeichen gefüllt hast. Dann solange aus dem "Sack" ziehen, bis du genug Zeichen hast.
 
vielleicht reicht dir schon:
PHP:
echo substr(md5(microtime()),0,5);

was hat das mit zufall zu tun???

PHP:
function scrambleString_v1($len){
  $chars = explode (" ", "A B C D E"); // da mit leerzeichen getrennt alles was später vorkommen darf...
  for ($i=0;$i<$len;$i++){
    $tmp .= $chars[rand(0, count($chars)-1)];
  }
  return $tmp;
}

function scrambleString_v2($len){
  $chars = "ABCDE";
  for ($i=0;$i<$len;$i++){
    $tmp .= $chars{rand(0, strlen($chars)-1)};
  }
  return $tmp;
}


echo scrambleString_v1(8); // 8 = länge vom string
echo scrambleString_v2(8); // 8 = länge vom string
 
Zuletzt bearbeitet:
was hat das mit zufall zu tun???

was ist zufall? ist es nicht schon zufall wann das script gestartet wird? wenn es dann endlich zur ausführung der einzelnen befehle kommt? das erste wird durch den faktor mensch bestimmt... das zweite wird durch andere prozesse auf dem system bestimmt. wenn das kein zufall ist, was ist dann zufall? deine rand() funktion wäre dann auch kein zufall mehr... sie funktioniert auch nur nach diesem prinzip, zwar etwas komlexer, aber immer noch nach diesem prinzip.
 
Nachdenken und (gebenenfalls im Manual) lesen!

omg. das hast du wohl vergessen:
microtime -- Gibt den aktuellen Unix-Timestamp/Zeitstempel mit Mikrosekunden zurück

und, steht da was von zufall? nein.


@tleilax: danke! Wusste zwar schon das sowas geht, habe mich aber nicht damit beschäftigt.. habe den obigen code mal geändert. ein benchmark test zeigt das es durch die direkte variante (ohne explode) bei 10000 aufrufen um eine zehntel sekunde schneller geht:

v1
1.29093122482
1.30512189865
1.30805182457
1.28091883659

v2
1.12293696404
1.13140177727
1.12662911415
1.12841796875
 
omg. das hast du wohl vergessen:
microtime -- Gibt den aktuellen Unix-Timestamp/Zeitstempel mit Mikrosekunden zurück

und, steht da was von zufall? nein.

Nein steht es nicht, aber mein Gehirn sagt mir, dass ich als Anwender in der Praxis so nicht beeinflussen kann, welchen Wert diese Funktion zurückgibt.

Deine Definition von Zufall wäre übrigens interessant zu hören.
 
Nein steht es nicht, aber mein Gehirn sagt mir, dass ich als Anwender in der Praxis so nicht beeinflussen kann, welchen Wert diese Funktion zurückgibt.

Deine Definition von Zufall wäre übrigens interessant zu hören.


Nachdenken und (gebenenfalls im Manual) lesen!

ich habe manual gelesen, da nix stehen microtime = zufall -> kapisch?


ich müsste über PHP zufallswerte in z.B. dieser Form genereieren lassen:
YNCS5K

definition von zufall mich nicht interessieren - ich nur antworten auf threadersteller.
er will haben zufallswert + vorgebene form, er sie bekommen..
 
Nein steht es nicht, aber mein Gehirn sagt mir, dass ich als Anwender in der Praxis so nicht beeinflussen kann, welchen Wert diese Funktion zurückgibt.

Deine Definition von Zufall wäre übrigens interessant zu hören.
Nicht beeinflüssbar <> Zufall
Der Wert bei der o.g. Funktion wird nicht zufällig generiert, sondern ist auf jede Millisekunde fest vorbestimmt. Ich könnte also rein Theoretisch diesen Wert mit einem millisekunden genauen Aufrufen der Funktionen den Wert beeinflussen. Außerdem würde ein Zeitgleiches Mehrfaches Aufrufen der Funktion 2mal exakt das selbe Ergebnis ergeben.
Der Zufall dagegen lässt sich unter keinen Umständen beeinflussen. Würde die Funktion zu selben Zeit mehrfach aufgerufen werden wären die Werte verschieden, oder besser gesagt wäre die Wahrscheinlichkeit, dass sie gleich sind sehr gering.
 
Nicht beeinflüssbar <> Zufall[...]

Die Frage ging nicht an dich - ich wollte nur seine Variante hören.

Allerdings reicht für den alltäglichen Gebrauch in der Webanwendung der Pseudozufall.

Man könnte auch sagen, man hat noch den "Zufall" darin, wie lange die Pakete bis zum Server brauchen - für "normale" Anwendung idR also völlig ausreichend ;)
 
Wollte nur sagen, dass er aus sicht der Bedeutung der Wörter mit seiner Behauptung, dass das o.g. Verfahren nichts mit Zufall zu tun hat, recht hat. Letztendlich reicht die microtime/md5-Variante aber eigentlich aus, um Pseudozufällige Strings zu generieren.
Das mit der Verbindungszeit spielt dabei aber eigentlich keine Rolle, die Werte für den Theoretischen gleichen Aufruf der Funktion stehen ja trotzdem fest, Also, wenn 10000 User gleichzeitig auf die Funktion gleichzeitig zugreifen besteht zumindest die Wahrscheinlichkeit, dass 2davon exakt den selben String erhalten, weil sie zur selben Zeit "da waren".
 
Also, wenn 10000 User gleichzeitig auf die Funktion gleichzeitig zugreifen besteht zumindest die Wahrscheinlichkeit, dass 2davon exakt den selben String erhalten, weil sie zur selben Zeit "da waren".

das stimtm nicht wirklich. diese chance liegt bei null, weil die requests selbst bei schönstem multitasking nicht gleichzeitig, sondern nacheinander aufgenommen werden. es liegt also immer eine gewisse zeitspanne dazwischen, die mind. im millisekundenbereich liegt. ein wirkliches multitasking (gleichzeitiges abarbeiten) gibt es in der computerwelt (noch?) nicht.

das problem bei "substr(md5(microtime()),0,5);" liegt aber eigentlich weniger in dem zeitunterschied als vielmehr darin, dass nur der gesammte string aus "md5(microtime())" als unique betrachtet werden kann. nur die ersten 5 zeichen davon abzuschneiden ist nicht mehr unique und damit für die aufgabe nicht mehr geeignet. ganz davon abgesehen, dass ein 5- oder 6-stelliger code reichlich klein gewählt ist, um irgendetwas abzubilden. ein kompletter 32-stelliger md5-code bietet sich eher an und sollte als sozusagen "quasistandard" auch benutzt werden.
 
Wo wir grad so schön abstrakt sind: der Prozess könnte je nach Auslastung auf verschiedenen Servern ausgeführt werden, die unterschiedlich viel Zeit zum Abarbeiten der Tasks benötigen und schon ist alles wieder möglich ;)
Null ist die Chance also auf keinen Fall, frei nach dem Motto alles ist möglich (man muss nur wissen wie ;))

Ahja: Trotzdem ist es kein Zufall welchen Code ich zu welcher Zeit bekomme, eher Pseudozufall.

Bei dem 2. Teil stimm ich dir zu, außerdem (falls ich das nicht überlsen habe) hast nur nur einen geringe Auswahl an zeichen (etwa 40, wenn ich nicht irre), was eine sagenhaft geringe Chance zuläst, dass 2Zufallswerte übereinstimmen...wobei auch nicht gesagt wird, dass das nicht sein darf ;)
 
ach gott... ich will nur eins klar stellen. ein computer kann keine zufallswerte erzeugen... ein computer kann nur werte mit hilfe von vordefinierten algorithmen berechnen. deswegen nennt sich das auch alles pseud zufalls werte... klar ist der algorithmus der hinter rand() steckt komplexer als md5(microtime()). jedoch wird dieser wert auch nur errechnet. sei es jetzt mit den werten die sich hinter irgendwelchen speicher registern versteckt... die ein programm vorher hinterlassen hat oder was weiß ich.

das der selbe wert irgendwo auftaucht ist zufall... md5(microtime()) ist die wahrscheinlichkeit zwar höher als bei anderen geposteten lösungen, aber es war ja nur ein bsp wie man es auch machen könnte. schon da md5 nur hexdezimal ausgibt... also 0-9a-f. aber je nach einsatz gebiet kann das vollkommen ausreichen... ich brauch keinen 128byte langen zufallswert nur für ne harmlose tan, die am ende nur zb für nen opt in verfahren verwendet wird.
 
Wo wir grad so schön abstrakt sind: der Prozess könnte je nach Auslastung auf verschiedenen Servern ausgeführt werden, die unterschiedlich viel Zeit zum Abarbeiten der Tasks benötigen und schon ist alles wieder möglich ;)
für wie wahrscheinlich hältst du es, dass hier von einer seite die rede ist, die auf mehreren servern gehostet wird?

Null ist die Chance also auf keinen Fall, frei nach dem Motto alles ist möglich (man muss nur wissen wie ;))
die chance ist null ... nicht 0!

hast nur nur einen geringe Auswahl an zeichen (etwa 40, wenn ich nicht irre),
32 zeichen a 16 werte ...