jari: zufallszahlen

hallo!

ich moechte ein Programm, das beim Klick auf den Button eine zufaellige Zahl liefert, die noch nicht gezogen worden ist!
Meine Vorstllung ist folgende:

  1. eine Zahl ziehen
  2. in der Datei gezogen.txt nachsehen, ob diese Zahl schon gespeichert wurde;
  3. wenn nein, dann speichern und Zahl am Bildschirm ausgeben;
  4. wenn ja, dann eine neue Zufallszahl --> bis man eine hat, die noch nicht in der Datei steht!

aber das funkt net ganz:
wenn Zahl schon existiert, dann muss man erneut auf den Button kicken .. das moechte ich nicht!!! ich moechte, dass so lange gesucht wird, bis eine gefunden worden ist!

was ist da falsch??

<form action="<?php $php_request?>" name="form1" method="post">
<input type="submit" name="ziehen" value="ZIEHUNG">
</form>

<?
if (isset($ziehen)) {
 $gezogen = rand(1,100);

$fp = fopen("gezogen.txt","r");

if ($fp){
  while (!feof($fp)){
   $startnummer = fgets($fp, 5);

if ($startnummer != $gezogen){

if (feof($fp)){
     echo $gezogen.";";
     $fp1 = fopen("gezogen.txt","a");
     fputs($fp1,$gezogen.";\n");
     fclose($fp1);break;}
    else {
     continue;
    }
    }

if ($startnummer == $gezogen){

$fp2 = fopen("gezogen.txt","r");
    if($fp2){
     while (!feof($fp2)){
      $startnummer = fgets($fp2, 5);

if ($startnummer != $gezogen2){
       exit;
       if (feof($fp2)){
        echo $gezogen2.";";
        $fp2 = fopen("gezogen.txt","a");
        fputs($fp2,$gezogen2.";\n");
        fclose($fp2);break;}
       }
    else {continue;}
      }
     }
    }
  }
}
fclose($fp);

}
?>

  1. Holladiewaldfee,

    wenn Zahl schon existiert, dann muss man erneut auf den Button kicken .. das moechte ich nicht!!! ich moechte, dass so lange gesucht wird, bis eine gefunden worden ist!

    Warum packst Du nicht einfach die Ziehung in eine Schleife und wiederholst den Kram so lange, bis Du eine Zahl ziehst, die noch nicht gezogen wurde?

    Aber Vorsicht, Notausstiegsebedingung gegen Endlosschleifen nicht vergessen (wenn schon alle Zahlen gezogen wurden).

    Ciao,

    Harry

    --
      Bald kommt die Waldfee ... (Projektphase: Planung)
      Bis dahin:
      http://harry.ilo.de/projekte/berge/
    1. Warum packst Du nicht einfach die Ziehung in eine Schleife und wiederholst den Kram so lange, bis Du eine Zahl ziehst, die noch nicht gezogen wurde?

      ja das moecht ich ja, aber weiss nicht wie ich da bloed tun soll! kannst mir bitte weiterhelfen?
      lg
      juergen

      1. Warum packst Du nicht einfach die Ziehung in eine Schleife und wiederholst den Kram so lange, bis Du eine Zahl ziehst, die noch nicht gezogen wurde?

        wie hast du das genau gemeint? ICH SCHAFF's NICHT!! koenntest du mein urspruengliches programm so aendern, dass es laeuft????

        BITTE
        j

        1. Hallo jari!

          wie hast du das genau gemeint? ICH SCHAFF's NICHT!! koenntest du mein urspruengliches programm so aendern, dass es laeuft????

          Dann lern doch erstmal Programmiergrundlagen ...

          Ansich mußt Du nur sowas ähnliches machen:
          $zufallszahl = zufall();
          $schondrin   = schon_drin($zufallszahl);
          while ($schondrin == true) {
              $schondrin = schon_drin($zufallszahl);
              if ($schondrin == true) {
                  $zufallszahl = zufall();
              }
          }

          Ich hoff mal, daß ich jetzt nicht völligen Müll geschrieben hab, aber sollte eigentlich klappen.

          MfG
          Götz

          --
          Losung für Dienstag, 28. September 2004
          So spricht der Herr: Dein Schaden ist verzweifelt böse, und deine Wunden sind unheilbar. Aber ich will dich wieder gesund machen und deine Wunden heilen. (Jeremia 30,12.17)
          Christus ist darum für alle gestorben, damit, die da leben, hinfort nicht sich selbst leben, sondern dem, der für sie gestorben und auferstanden ist. (2. Korinther 5,15)
          (http://www.losungen.de/heute.php3)
  2. Hallo jari!

    Meine Vorstllung ist folgende:

    1. eine Zahl ziehen
    2. in der Datei gezogen.txt nachsehen, ob diese Zahl schon gespeichert wurde;
    3. wenn nein, dann speichern und Zahl am Bildschirm ausgeben;
    4. wenn ja, dann eine neue Zufallszahl --> bis man eine hat, die noch nicht in der Datei steht!

    Hört sich eigentlich ganz sinnig an.

    aber das funkt net ganz:

    Was soll da auch funken?

    was ist da falsch??

    <?php $php_request?>

    Hier würde ich nicht diese minimalistische Schreibweise nehmen, ist aber Geschmackssache.

    if (isset($ziehen)) {
    $gezogen = rand(1,100);

    $fp = fopen("gezogen.txt","r");

    if ($fp){
      while (!feof($fp)){
       $startnummer = fgets($fp, 5);

    if ($startnummer != $gezogen){
    [...]
        }

    Hier könntest Du einen else-Block nehmen.

    if ($startnummer != $gezogen2){

    Wo wird denn $gezogen2 überhaupt erzeugt?

    Du solltest mal am Anfang Deine Scriptes das Error-Reporting auf E_ALL stellen (error_reporting(E_ALL);).

    Ansonsten brauchst Du nur eine gewöhnliche Rekursion.

    Also, schreib Dir eine Funktion, die eine Zufallszahl erzeugt (bzw. da nimmst Du ja direkt rand).
    Schreib eine Funktion, die prüft, ob eine Zahl schon in der Datei existiert.

    Dann erzeuge erstmal eine Zufallszahl, prüfe mit der Prüffunktion ob sie existiert, wenn ja, erzeuge nächste ...
    (müßte auch mit einer while-Schleife gehen, also brauchst nichtmal zwingend eine Rekursion, wenn ich mir das grad richtig überlegt habe, aber das kannst ja ausprobieren)

    MfG
    Götz

    --
    Losung für Dienstag, 28. September 2004
    So spricht der Herr: Dein Schaden ist verzweifelt böse, und deine Wunden sind unheilbar. Aber ich will dich wieder gesund machen und deine Wunden heilen. (Jeremia 30,12.17)
    Christus ist darum für alle gestorben, damit, die da leben, hinfort nicht sich selbst leben, sondern dem, der für sie gestorben und auferstanden ist. (2. Korinther 5,15)
    (http://www.losungen.de/heute.php3)
  3. Hi,

    ich moechte ein Programm, das beim Klick auf den Button eine zufaellige Zahl liefert, die noch nicht gezogen worden ist!
    Meine Vorstllung ist folgende:

    1. eine Zahl ziehen
    2. in der Datei gezogen.txt nachsehen, ob diese Zahl schon gespeichert wurde;
    3. wenn nein, dann speichern und Zahl am Bildschirm ausgeben;
    4. wenn ja, dann eine neue Zufallszahl --> bis man eine hat, die noch nicht in der Datei steht!

    aber das funkt net ganz:
    wenn Zahl schon existiert, dann muss man erneut auf den Button kicken .. das moechte ich nicht!!! ich moechte, dass so lange gesucht wird, bis eine gefunden worden ist!

    was ist da falsch??

    Der Algorithmus. Je mehr Zahlen aus der Folge 1..100 gezogen wurden, desto länger dauert die nächste Zahl zu ziehen. Sollte die rand() Funktion perfekt sein, ist es möglich, das Punkt 4 zu keinem praktikablen Ende führt.

    Die Reihenfolge ist also verkehrt.

    1. Lies aus einer Datei die gewünschte Folge.
      1a) Ist die Datei leer oder nicht existent: erzeuge sie.

    2. Wähle zufällig ein Mitglied der eingelesenen Folge aus.

    3. Verfahre damit nach Wunsch. Prüfe aber, ob das Mitglied erfolgreich verwendet wurde, wenn ja:
      3a) Lösche dieses Mitglied aus der Datei aus 1)

    so short

    Christoph Zurnieden

  4. Hallöchen,

    Du könntest das Pferd auch von der anderen Seite aufzäumen:

    Erzeuge ein zweidimensionales Array mit dem zu verwendenden Zahlenraum.
    Prüfe, ob es die Ablagedatei gibt; wenn ja, trage für alle bereits verwendeten Zahlen einen Indexwert in das Array ein.
    Lies die übrigen Zahlen (die ohne den entsprechenden Indexwert) in ein neues Array ein und lasse per Zufallsfunktion eine davon auswählen.
    Speichere die Zahl in Deiner Ablagedatei.

    Jester