好的,这就是我的问题。我有一系列的名字。我想以随机顺序设置一个名称指向另一个名称的位置。但没有任何名字指向自己。我希望每个值都由不同的值指向,每个值只指向一个值,而不是自身。 希望我能想出一个更好的方式来表达这一点。这是我目前正在使用的方法
while($xcount>=1){
$orderarray[($xcount-1)]=$xcount;
$xcount--;
}
shuffle($orderarray);
问题是我不希望$ orderarry [$ x]等于[$ x],这似乎几乎每次都会发生。有没有办法做到这一点。
无论如何,当一群人把自己的名字戴在帽子上,然后每个人从帽子里挑出一个名字时,我试图虚拟地去做会发生什么。喜欢秘密的圣诞老人。
答案 0 :(得分:0)
试试这个
$names = [1, 2, 3, 4, 5];
shuffle($names);
while (key($names) !== null)
{
$current = current($names);
$next = next($names);
if ($next) // is not last
$bonds[] = [$current, $next];
}
$bonds[] = [end($names), reset($names)]; // last
var_dump($bonds);
答案 1 :(得分:0)
使用以下代码解决问题,获取一个随机数并确保该号码未被使用且未指向自身。
$neworder=array();
$xcount=count($gmemberarray);
//fill the array with numbers and a setting of false *hasn't been used*
while($xcount>=1){
//$orderarray[($xcount-1)]=arrray();
$orderarray[($xcount-1)][0]=($xcount-1);
$orderarray[($xcount-1)][1]=false;
$xcount--;
}
$xcount=count($gmemberarray);
$count=$xcount;
while($xcount>=1){
R:
$randnum=rand(0, ($count-1));
if($orderarray[$randnum][1]==true) //If it's already been used get a different number
goto R; //otherwise try again
if($xcount!=$randnum){ //if it's not equal to itself
$neworder[($xcount-1)]=$randnum;
$orderarray[$randnum][1]=true;
echo "<br><br>Neworder ".$xcount.": ".$neworder[($xcount-1)];
}
else
goto R; //otherwise try again
$xcount--;
}
输入数据将是:
orderarray[1]=1
orderarray[2]=2
orderarray[3]=3
orderarray[4]=4
我希望输出的一个例子是:
orderarray[1]=3
orderarray[2]=4
orderarray[3]=2
orderarray[4]=1