Voglio scrivere una funzione che restituisca numeri di coppia univoci casuali ogni volta che lo chiamano da un intervallo fino a quando non lo si azzera. Qualcosa del genere:
function randomUniquePairs($ranges, $reset = false){
if ($reset === false){
// some code for reseting
}
/*
some code for creating random unique pair numbers
*/
return $result;
}
randomUniquePairs(range(1,10), range(1,20));
/*
this function returns for example:
array(2,9)
*/
randomUniquePairs(range(1,10), range(1,20));
/*
this function returns for example:
array(5,19)
*/
randomUniquePairs(range(1,10), range(1,20));
/*
this function returns for example:
array(5,9)
*/
//this function returns random unique pairs until we pass reset paramer true
Ho provato due approcci:
Approccio 1
Il mio primo tentativo è stato quello di creare una matrice di tutte le coppie possibili e poi selezionarle casualmente, ma è molto inefficiente, perché se le gamme sono così ampie, consuma molta memoria.
il codice:
class a {
private $asqar;
function __construct() ($range) {
// cycle for ranges
foreach ($range[0] as $v1) {
foreach ($range[1] as $v2) {
$asqar[] = array(
$v1,
$v2,
);
}
}
}
function randomUniquePairs($reset = false){
if ($reset === true){
$this->asgar = array();
}
$rndKey = array_rand($this->asgar);
$result = $this->asqar[$rndkey];
unset($this->asqar[$rndkey]);
return $result;
}
}
$c = new a(range(1,10), range(1,20));
$c->randomUniquePairs();
Approccio 2
Il mio secondo tentativo è stato quello di scrivere una funzione che producesse una coppia da questi intervalli, quindi memorizzarla in una variabile, ogni volta che la funzione richiama dopo aver prodotto una coppia, controlla se questa coppia produce prima di chiamare la funzione in modo ricorsivo, continua finché non produce un coppia unica.
Ecco il codice:
class a{
private $__uniqueVariables = array();
public function randomUniquePairs($range, $reset = false) {
if ($reset === true){
$this->__uniqueVariables = array();
}
// cycle for each value
foreach ($range as $value) {
// shuffle
shuffle($value);
// selected id
$selectedId[] = $value[0];
}
// check for selected variable
if (in_array($rndUnqNum, $this->__uniqueVariables)) {
// return for try again
return $this->uniqueVariable($range);
}
// added to current unique variables
$this->__uniqueVariables[] = $rndUnqNum;
// return
return $rndUnqNum;
}
}
ma questo secondo approccio presenta un problema che a volte genera Fatal error: Maximum function nesting level of '100' reached
.
Sto cercando un approccio migliore al mio algoritmo.