• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Zufallszahl erstellen - dabei aber Zahlen ausschließen

andy83

New member
Moin, moin!

ich erstelle ganz simpel ne Zufallszahl
PHP:
$num=mt_rand(1,6);

nun möchte ich gerne die Option eingebaut haben, die (eine) bestimmte Zahl(en) ausschließt....

Hat jemand ne Idee??? Vielen Dank
 
Hast du dir das (php.net) schon mal angeschaut:

A little useful function to create a random unique number out of an array of unallowed values:
PHP:
<?php
function rand_except($min, $max, $except)
  //function returns a random integer between min and max, just like function rand() does.
  // Difference to rand is that the random generated number will not use any of the values
  // placed in $except. ($except must therefore be an array)
  // function returns false if $except holds all values between $min and $max.
  {
  //first sort array values
  sort($except, SORT_NUMERIC);
  //calculate average gap between except-values
  $except_count = count($except);
  $avg_gap = ($max - $min + 1 - $except_count) / ($except_count + 1);
  if ($avg_gap <= 0)
     return false;
  //now add min and max to $except, so all gaps between $except-values can be calculated
  array_unshift($except, $min - 1);
  array_push($except, $max + 1);
  $except_count += 2;
  //iterate through all values of except. If gap between 2 values is higher than average gap,
  // create random in this gap
  for ($i = 1; $i < $except_count; $i++)
      if ($except[$i] - $except[$i - 1] - 1 >= $avg_gap)
         return mt_rand($except[$i - 1] + 1, $except[$i] - 1);
  return false;
  }
?>
 
Bitte verwende diesen Code nicht! Er kann nicht alle erwünschten Zufallszahlen ausgeben.
Wenn der Zahlenbereich nicht groß ist, könnte man ein Array mit den erlaubten Zahlen machen und dann einen zufälligen Index auswählen.
Wenn der Zahlenbereich aber zu groß ist, kann man (ähnlich wie in diesem Code) die Bereiche definieren, in denen Zahlen erlaubt sind. Dann wählt man zufällig, nach der Größe bewichtet einen Bereich aus und lässt sich dann aus diesem eine Zufallszahl ausgeben.
 
Wenn die Menge der unerlaubten/verbrachten Werte klein gegen den Rest bleibt, gibt es eine einfache Lösung:
PHP:
$unallowedValues = array(3,5);
while(true)
{
  $num = mt_rand(1,6); 
  if(!in_array($num,$unallowedValues)) break;
}

Hinweis für Theoretiker: Es besteht eine Wahrscheinlichkeit > 0, daß es zu einer Überschreitung der max_execution_time kommt.
 
Für den allgemeinen Fall gibt es auch noch eine einfachere Möglichkeit:
Code:
function rand_except($min, $max, $except){
	$except = array_unique($except, SORT_NUMERIC);
	sort($except, SORT_NUMERIC);
	$len = count($except);
	$rand = mt_rand($min, $max - $len);
	for ($i = 0; $i < $len && $except[$i] <= $rand; $i++){
		$rand++;
	}
	return $rand;
}

WICHTIG: bei diesem Ansatz müssen alle Zahlen in $except innerhalb des Intervals [$min, $max] liegen - sonst funktioniert's nicht mehr (oder man muss den Array vorher noch entsprechend filtern).
 
Zuletzt bearbeitet:
Zurück
Oben