Zufall, der definiert ist

  • Themenstarter Themenstarter Sealtuagn
  • Beginndatum Beginndatum
S

Sealtuagn

Also.. ich hab da mal ne Frage.....

Es gibt ja die funktion rand();

so...
sagen wir mal ich verwende die als ermittlung einer Zufälligen Nummer...
das ganze habe ich 4 mal in einer Datei...
also
$1 = rand();
$2 = rand();
$3 = rand();
$4 = rand();

so.. nun will ich aber verhindern, dass eine der variablen $1, $2, $3, $4 die gleiche Zahl hat. Wenn aber doch eine gleiche Zahl auftreten sollte, dann soll solange eine neue Zufällige Zahl ermittelt werden, bis KEINE der Variablen die gleiche Zahl haben...

Ich hoffe ihr versteht, was ich meine.
Wie kann ich sowas realisieren ?
Könnt mir mir da helfen ?
Ich hab da keine Idee...
 
Das was mir jetzt am schnellsten einfallen würde, wäre, dass ich den einzelnen Variablen einen bestimmten Bereich an Zahlen zur Verfügung stelle. Also z.B.:
PHP:
$v[1] = rand(0,10000000);
$v[2] = rand(10000001,10000000000);
$v[3] = rand(10000000001,10000000000000);
$v[4] = rand(10000000000000001,10000000000000000000);

mb fanste

PS: Man kann doch gar keine nummerischen Variablen verwenden, oder?
 
fanste hat gesagt.:
PS: Man kann doch gar keine nummerischen Variablen verwenden, oder?
Also so funktionierts:
PHP:
srand(microtime()*10000000);
$_SESSION['zufallszahl'] = rand(1, 100);

Aber ich will halt das ganze 4 mal in einer Datei und dann, dass die Zufalls-Zahl nicht die geliche ist !
 
Du musst nur Deinen verbal beschriebenen Algorithmus in Code umsetzen:
PHP:
<?
$min = 1;
$max = 10;
$anzahl = 4;
$randomNumbers = array();
if ($max-$min>=$anzahl-1) {
    for ($i=0; $i<$anzahl; $i++) {
        $r = rand($min,$max);
        while (in_array($r,$randomNumbers,true)) {
            $r = rand($min,$max);
        }
        $randomNumbers[] = $r;
    }
} else {
    echo "So gehts nicht!";
}
print_r($randomNumbers);
?>
Gruß hpvw

EDIT: PS: Es gehört übrigends zum Zufall dazu, dass auch zwei mal hintereinander dieselbe Zahl auftauchen kann.
 
Zuletzt bearbeitet:
hpvw hat gesagt.:
Du musst nur Deinen verbal beschriebenen Algorithmus in Code umsetzen:
PHP:
<?
$min = 1;
$max = 10;
$anzahl = 4;
$randomNumbers = array();
if ($max-$min>=$anzahl-1) {
    for ($i=0; $i<$anzahl; $i++) {
        $r = rand($min,$max);
        while (in_array($r,$randomNumbers,true)) {
            $r = rand($min,$max);
        }
        $randomNumbers[] = $r;
    }
} else {
    echo "So gehts nicht!";
}
print_r($randomNumbers);
?>
Gruß hpvw

EDIT: PS: Es gehört übrigends zum Zufall dazu, dass auch zwei mal hintereinander dieselbe Zahl auftauchen kann.

und das ganze bitte noch erklärt, denn bei den script-gewusen verstehe ich null..
wäre sehr nett....
bin da nich so fitt drinne mit dem erkennen....

Einfach nur wenn Zahl so und so = so oder so oder so, dann mach aus der zahl ne neue...
kann man das nicht in einer for-schleife machen ?
 
PHP:
<?
//Zur Übersicht werden die Parameter definiert

//Minimale Zahl, die durch Zufall erzeugt werden soll
$min = 1;

//Maximale Zahl, die durch Zufall erzeugt werden soll
$max = 10;

//Anzahl der benötigten Zufallszahlen
$anzahl = 4;

//Array vordefinieren, in dem die Zufallsvariablen 
//abgelegt werden
$randomNumbers = array();

//Sicherheitsüberprüfung, gegen Endlosschleife
//Es können nicht mehr verschiedene Zahlen
//gezogen werden, als es verschiedene Zahlen gibt
if ($max-$min>=$anzahl-1) {
    //Schleife, die so oft durchläuft,
    //wie Zufallszahlen gewünscht sind
    for ($i=0; $i<$anzahl; $i++) {
        //Zufallszahl ziehen
        $r = rand($min,$max);
        //Ziehung wiederholen, falls die 
        //Zufallszahl bereits im Array ist
        //und solange wiederholen bis
        //bis die neue gezogene Zahl nicht 
        //im Array ist
        while (in_array($r,$randomNumbers,true)) {
            $r = rand($min,$max);
        }
        //Zufallszahl dem Array hinzufügen
        $randomNumbers[] = $r;
    }
} else {
    //Ausgabe falls if-Bedingung oben
    //fehlgeschlagen ist
    echo "So gehts nicht!";
}
//Ausgabe der Zufallszahlen für Kontrollzwecke
print_r($randomNumbers);
?>
Da PHP unglaublich viele Funktionen für Arrays bietet geht es hier auch mit einer Schleife. Allerdings ist der Code dann nicht so leicht auf andere Programmiersprachen portierbar:
PHP:
<?
//wie oben
$min = 1;
$max = 10;
$anzahl = 4;
$randomNumbers = array();

//Sicherheitsabfrage, auch noch wie oben
if ($max-$min>=$anzahl-1) {
    //So lange Zufallszahlen ziehen, bis $anzahl
    //verschiedene Zufallszahlen gezogen wurden
    while (count($randomNumbers)<$anzahl) {
        //Zufallszahl ziehen und dem Array hinzufügen
        $randomNumbers[] = rand($min,$max);
        //doppelte Einträge aus dem Array entfernen
        $randomNumbers = array_unique($randomNumbers);
    }
} else {
    //wie oben
    echo "So gehts nicht!";
}
//wie oben
print_r($randomNumbers);
?>
Außerdem besteht die Gefahr, dass eine solche Funktion ([phpf]array_unique[/phpf]) in einer späteren Version von PHP aus Performancegründen leicht anders arbeitet, insbesondere, was die "temporäre" Sortierung angeht, und Du dann nicht unbedingt die vom Zufall erzeugte Reihenfolge der Zahlen erhältst, im schlimmtsen Fall könnte ein sortiertes Array übrigbleiben. In anderen Programmiersprachen können solche Funktionen zum Beispiel nur auf sortierte Listen angewendet werden.

Gruß hpvw
 
Cool, ich danke dir !
ich habs kapiert und werde diese funktion, denke ich mal, auch anwenden.

Du hast mir garde echt vom Schlach geholfen...
Aber jetzt ist meine "Frage"-Luke aufgegangen...
gibts da noch andere Möglichkeiten :-P

Aber danke ! ich denke, so werd ichs machen !
*umknuddel*
 
Und Wenn ich jetzt Pro Array-Eintrag den ganzen Schott, also die Nummer in eine My-SQL Datenbank speichenr will.. wie muss ich das dann machen ?
 
PHP:
<?
$min = 1;
$max = 10;
$anzahl = 4;
$randomNumbers = array();
if ($max-$min>=$anzahl-1) {
    for ($i=0; $i<$anzahl; $i++) {
        $r = rand($min,$max);
        while (in_array($r,$randomNumbers,true)) {
            $r = rand($min,$max);
        }
        $randomNumbers[] = $r;
        $query = "Insert INTO blabla (nummer) values ('$r')";
        mysql_query($query);
    }
} else {
    echo "So gehts nicht!";
}
print_r($randomNumbers);
?>
 
Zurück