リセットするまで、範囲から呼び出すたびにランダムな一意のペア番号を返す関数を書きたいと思います。このようなもの:
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,19)
*/
//this function returns random unique pairs until we pass reset paramer true
私は2つのアプローチを試みます:
1) 可能なペアをすべて作成し、それらからランダムに選択しますが、範囲が非常に広い場合、多くのメモリを消費するため、非常に非効率的です。コード:
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();
2)2番目は、これらの範囲からペアを生成する関数を作成し、それを変数に格納します。ペアを生成した後にその関数が呼び出されるたびに、関数を再帰的に呼び出す前にこのペアが生成されたかどうかを確認し、一意の値を生成するまで続行しますペア。このコード:
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;
}
}
しかし、これには時々スローする問題がありFatal error: Maximum function nesting level of '100' reached
ます。
もっと良いアルゴリズムが欲しい。