jaquel: CodeMaker

Hi,

function make_seed() {
 list($usec, $sec) = explode(' ', microtime());
 return (float) $sec + ((float) $usec * 100000);
}

function createcode($anz) {
 mt_srand(make_seed());

$pass = "";
 $zeichen = "abcdefghijklmnopqrstuvwxyz".
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
#      "0123456789öäüÖÄÜ";
      "0123456789";

for($i=0; $i < $anz; $i++) $pass .= $zeichen[mt_rand(0,strlen($zeichen))];

return $pass;
}

Ein toller Codemaker - jedoch mit einem Bug!
Ich übergeb ja die länge des Codes ($anz) - so kann ich 2 stellige Codes erzeugen der auch 10 - wie auch immer.
doch genau da liegt das problem. manchmal erzeugt er einen code der genau ein zeichen zu kurz ist wie ich möchte.. wo liegt denn der fehler?

jaquel

  1. Hi,

    ich hab mich jetzt nicht genau mit deinem Code befasst...

    aber versuchs mal mit for($i=0; $i <= $anz; $i++)

    vielleicht tuts ja dann

    Gruß Mika

    1. Hallo!

      aber versuchs mal mit for($i=0; $i <= $anz; $i++)

      vielleicht tuts ja dann

      Blödsinn. Wenn du $n Durchläufe haben willst, dann fang bei 0 an und füge als Abbruchbedingung $i<$n ein. Das passt schon.
      Wenn weniger Durchläufe durchgeführt werden, dann liegt woanders der Hund begraben.

      mfg
        frafu

  2. echo $begrüßung;

    Ich übergeb ja die länge des Codes ($anz) - so kann ich 2 stellige Codes erzeugen der auch 10 - wie auch immer.
    doch genau da liegt das problem. manchmal erzeugt er einen code der genau ein zeichen zu kurz ist wie ich möchte.. wo liegt denn der fehler?

    Bitte ermittle zunächst, welche Situationen das sind, indem du die Ergebnisse ausgibst, die die Funktion mt_rand() in diesem Fall in den einzelnen Durchläufen der Schleife liefert. Ebenso wäre interessant, welche Zeichen dann aus $zeichen genommen werden und wie $pass am Ende aussieht. Verwende für die Ausgabe am besten die Funktion var_dump().

    echo "$verabschiedung $name";

  3. Ahoi jaquel,

    for($i=0; $i < $anz; $i++)

    while(strlen($pass)<$anz)

    MfG

    1. Moje,

      for($i=0; $i < $anz; $i++)
      while(strlen($pass)<$anz)

      Ja das ist gut, damit erhalte ich auf jeden Fall einen Code der so lange ist wie er sein sollte, aber das Problem bzw. deren Ursache ist ja immernoch im code, oder!? aber ist ja auch wurscht! Hauptsache es geht ;)

      jaquel

      1. Ahoi jaquel,

        habs mir nochmal angeschaut:

        $zeichen[mt_rand(0,strlen($zeichen))];

        hier könnte der hund begraben gelegen haben denn

        mt_rand ( [int $min, int $max] )

        ein string der z.B. 24 Zeichen enthält geht von 0 bis 23.

        das 24te Zeichen ist dann wohl  nix '' => zu kurze wörter.

        MfG