clasku, ti sei dato un gran da fare! badaze... su grandi intervalli con poche estrazioni è sicuramente avvantaggiata dalla dea bendata.
Ammettiamo che array_pop sia una funzione sciagurata che anzichè spostare il puntatore nel vettore avanti di uno restituendo l'elemento appena scartato e riducendo la dimensione del vettore effettui una copia integrale dell'array a meno di un elmento. Ciò nonostante è facilmente aggirabile l'uso di array_pop. Di contro sappiamo che in_array effettua una ricerca lineare, quindi l'algoritmo proposto all'inizio del 3d ha complessità esponeneziale.
Quello che propongo ha complessità lineare. Certo potrai avere il caso fotunato in cui il tuo test potrà dirti che quello con complessità esponenziale si è comportato meglio, ma una complessità lineare è sicuramente meglio. Per cortesia evitiamo di criticare la classe
.
Codice PHP:
<?php
class GeneratoreNumeri{
private $elenco=array();
private $ultimo=0;
private $dim=0;
public function __construct($min,$max) {
$this->rigenera($min, $max);
}
public function rigenera($min,$max){
$temp=range($min,$max);
shuffle($temp);
$this->elenco=$temp;
$this->dim = count($this->elenco);
}
public function rand(){
if($this->dim>0){
$this->dim--;
return $this->elenco[$this->ultimo++];
}else
throw new Exception("Non ci sono più elementi da estrarre");
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Estrazioni casuali</title>
</head>
<body>
<?php
$numEstrazioni = 30;
$generatore = new GeneratoreNumeri(1, 100);
for($i=0; $i<$numEstrazioni; $i++)
echo $generatore->rand().'; ';
?>
</body>
</html>
Ora divertiti pure a fare i test, ma non venirmi a raccontare che un algoritmo con complessità lineare è peggiore di uno con complessità esponenziale.