PHP Zufallszahl von 1-10 aber nicht 3 4 und 7

chrisi01

Romy lieb haben
ID: 101113
L
26 November 2008
2.854
238
hi

PHP:
  $foo = mt_rand(1,10); 
  while ($foo == 7 OR $foo == 4 OR $foo == 3)
  {
    $foo = mt_rand(1,10); 
  }
gibt es dafür eine einfachere Lösung (schnellere, bessere oder gar fertige Funktion) ? Ich will eine Zufallszahl von 1-10 haben aber nicht die 3, 4 und 7.

mfg

Chris
 
mach einen array mit 7 Elementen und schreib die Zahlen 1,2,5,6,8,9,10 rein.
Dann ermittle eine Zufallszahl zwischen 1 und 7 und nimm den Wert, der in dem entsprechenden array-Element steht.

Also sowas in der Art:

PHP:
$foo = array (1,2,5,6,8,9,10) ;
$zufallszahl = $foo [ mt_rand(1,7) ] ;
 
pack doch einfach die Zahlen 1,2,5,6,8,9 und 10 in ein Array und dann machst den Random ;)

Bsp folgt gleich

*edit*
7 sec zu spät :mrgreen:
BSP kommt trotzdem gleich

*edit2*
PHP:
$val = array(1,2,5,6,8,9,10);
$foo = array_rand($val, 1);
echo $val[$foo[0]];

*edit3*
oder so wie transversalis es vorgeschlagen hat ;)
 
Zuletzt bearbeitet:
hi

ich danke euch die Idee ist gut. Das Problem dabei ist das ich nicht immer nur die 3 4 und 7 nicht brauche sondern diese Zahlen vorher auch in eine Variable gespeichert werden ich zeige euch mal ein Beispiel was ich meine (auf meine Art)

PHP:
$a = mt_rand(1,10);
$b = mt_rand(1,10);
$c = mt_rand(1,10);
do
{
  $foo = mt_rand(1,10);
} 
while($foo == $a || $foo == $b || $foo == $c)
so wie kann ich da das array nun am besten aufbauen? bzw. wird das dann nicht komplizierter als meine Lösung? Ich gebe zu ich arbeite nicht gerne mit arrays und umgehe es dort wo ich es nicht unbedingt benötige...

@ice-breaker danke gute Idee :)

mfg

Chris
 
naja, wenn sich die Werte der Variablen, die nicht "gezogen" werden immer wieder ändern ist die Version die du eben gepostet hast am Besten denk ich.
Denn wenn du es mit einem Array machen willst müsstest du ja immer erstmal das komplette Array (mit allen Zahlen von 1-10) aufbauen und dann daraus die "nicht erlaubten Werte" löschen und erst danach mit array_rand eine neue Zufallszahl ermitteln.

Code wäre dann wie folgt:
PHP:
$var = array(1,2,3,4,5,6,7,8,9,10); //komplettes Array mit allen Zahlen von 1 bis 10
$a = mt_rand(1,10); //erste Zufallszahl, die nicht "gezogen" werden darf
$b = mt_rand(1,10); //zweite Zufallszahl, die nicht "gezogen" werden darf
$c = mt_rand(1,10); //dritte Zufallszahl, die nicht "gezogen" werden darf

unset($var[$a-1]); //erste nicht erlaubte Zahl aus Array entfernen
unset($var[$b-1]); //zweite nicht erlaubte Zahl aus Array entfernen
unset($var[$c-1]); //dritte nicht erlaubte Zahl aus Array entfernen

$foo = array_rand($val, 1); //Zufallszahl ermitteln
echo $val[$foo[0]]; //ermittelte Zufallszahl ausgeben.

*edit*
wie du siehst ist das mit einem Array mehr code, als die Version, wie du es gelöst hast. Was nun wirklich schneller ist kann ich dir nicht genau sagen, das müsste man dann mal messen ;)
 
Vielleicht verstehe ich das Problem nicht, aber dein Code - etwas verkürzt - sind 3 Zeilen:
PHP:
$n_foo=array($a = mt_rand(1,10),$b = mt_rand(1,10),$c = mt_rand(1,10));
echo 'Verbotene Zahlen: '.$a.', '.$b.', '.$c.'<br>';
do $foo = mt_rand(1,10);
while(in_array($foo,$n_foo));
echo 'Erlaubte Zahl: '.$foo;

eaxo
 
PHP:
unset($var[$a-1]); //erste nicht erlaubte Zahl aus Array entfernen
unset($var[$b-1]); //zweite nicht erlaubte Zahl aus Array entfernen
unset($var[$c-1]); //dritte nicht erlaubte Zahl aus Array entfernen
Das verwechselt jemand Index und Wert eines Arrayelements.
Gefährlich... es müsste hinhauen, aber empfehlenswert is das nicht.
 
So würde ich das machen. Ist wahrscheinlich langsamer, als einfach mit dem OR-Operator zu arbeiten, dafür aber wesentlich flexibler :)

PHP:
$exclude = array(3, 4, 7);

do {
    $rnd = rand(1, 10);
} while(in_array($rnd, $exclude));

Greetz

paddya
 
Das verwechselt jemand Index und Wert eines Arrayelements.
Gefährlich... es müsste hinhauen, aber empfehlenswert is das nicht.

nein, denn wenn man den code so übernimmt wie ich es gepostet habe, dann ist bei jedem Index auch der Wert des Index gleich dem Index + 1.
*edit*
Also:
$var[0] = 1
$var[1] = 2
$var[2] = 3
$var[3] = 4
$var[4] = 5
.
.
.
.
Also: Wert = Index +1


*edit2*
mir kommt grad noch eine andere Idee ;)

PHP:
$boese = array(mt_rand(1,10),mt_rand(1,10),mt_rand(1,10));
do
{
  $foo = mt_rand(1,10);
} 
while(in_array($foo,$boese))

*edit3*
ich seh grad, dass eaxo bereits denselben Lösungsansatz hatte wie ich jetzt im 2. edit gepostet hab nur ein bissl abgewandelt.
 
Zuletzt bearbeitet:
[...]
mir kommt grad noch eine andere Idee ;)
[...]
Mir auch :p
Vermutlich haben wir einen Fehler in unserer Denkweise. Wir haben zwar 3 Datensätze in unseren Arrays, aber 3 auszuschließende Zahlen nicht (immer).
Wenn wir 3 unterschiedliche Zufallszahlen brauchen,warum dann nicht gleich die Schleife 4 Zahlen ermitteln lassen und erst in der Weiterverarbeitung eine Gewinnzahl bestimmen?
PHP:
for ($zahlen=array(),$zahl = mt_rand(1,10) ; count($zahlen)<= 3 ; $zahl = mt_rand(1,10)){
    if (!in_array($zahl,$zahlen)) array_push($zahlen,$zahl); }


// Hier ist die Ausgabe wichtig!
  echo "Verbotene Zahlen: ";
  for ($i=0;$i<=2;$i++) echo $zahlen[$i]." ";
  echo '<br>Erlaubte Zahl: '.$zahlen[$i];
 
Zuletzt bearbeitet:
Habe in meiner ersten Lösung überlesen, dass du immer drei Zufallszahlen willst, die verboten sein sollen.

PHP:
$exclude = array();

while(count($exclude) < 3) {
    $number = mt_rand(1, 10);
    if(in_array($number, $exclude))
        continue;
    $exclude[] = $number;
}

do {
    $rnd = mt_rand(1, 10);
} while(in_array($rnd, $exclude));

Greetz
paddya
 
Zuletzt bearbeitet:
...
PHP:
for ($zahlen=array(),$zahl = mt_rand(1,10) ; count($zahlen)<= 3 ; $zahl = mt_rand(1,10)){
    if (!in_array($zahl,$zahlen)) array_push($zahlen,$zahl); }


// Hier ist die Ausgabe wichtig!
  echo "Verbotene Zahlen: ";
  for ($i=0;$i<=2;$i++) echo $zahlen[$i]." ";
  echo '<br>Erlaubte Zahl: '.$zahlen[$i];

Diese Version gefällt mir am Besten ;)

sehr gut :)
 
[...] Diese Version gefällt mir am Besten ;)

Ich persönlich würde an dieser Stelle allerdings keinen for-Loop verwenden, weil man diesen normalerweise nur verwendet, wenn man schon vorher weiß, wieviele Iterationen dieser durchlaufen wird. Das ist in diesem Fall nicht gegeben :)

Greetz

paddya

Edit: hab meinen Code mal gefixt. Sollte jetzt wirklich nur 3 Zahlen ins Array schreiben :)