PHP -如果两个变量相等,重新随机化一个


PHP - IF two variables are equal, re-randomize one?

我是相当新的编码PHP从头开始,我试图编码一个简单的小应用程序作为一个挑战。它的想法是获取两个。txt文件,并从这些文件中的名字中随机选择一个梦幻足球队。我相信有更短/更简单的方法可以做到我目前所做的,但我所写的在某种程度上是有效的——除了我似乎不能让它在两次拉同一玩家时重新随机化一个玩家。我哪里做错了?

到目前为止的所有代码如下:

// Goalkeeper
$f_contents_goalkeepers = file("goalkeepers.txt"); // Load the Goalkeepers Database and add it to an array
shuffle($f_contents_goalkeepers); // Shuffle the contents of the array
$randGoalkeeper = $f_contents_goalkeepers[array_rand($f_contents_goalkeepers)]; // Add a random goalkeeper to the randGoalkeeper variable
$goalkeeper = $randGoalkeeper; // Set the Goalkeeper variable to use the random goalkeeper
//
// Defender
$f_contents_defenders = file("defenders.txt"); // Load the Defenders Database and add it to an array
shuffle($f_contents_defenders); // Shuffle the contents of the array
$randDefender1 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender1 variable
$randDefender2 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender2
    // If $randDefender2 is the same as $randDefender1, pick another player
    if($randDefender2 == $randDefender1) {
        $randDefender2 = $f_contents_defenders[array_rand($f_contents_defenders)];
    }
$randDefender3 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender variable
    // If $randDefender3 is the same as $randDefender2, pick another player
    if($randDefender3 == $randDefender2) {
        $randDefender3 = $f_contents_defenders[array_rand($f_contents_defenders)];
    }
$randDefender4 = $f_contents_defenders[array_rand($f_contents_defenders)]; // Add a random defender to the randDefender variable
    // If $randDefender4 is the same as $randDefender3, pick another player
    if($randDefender4 == $randDefender3) {
        $randDefender4 = $f_contents_defenders[array_rand($f_contents_defenders)];
    }
$defender1 = $randDefender1; // Set the Defender variable to use the random defender
$defender2 = $randDefender2;
$defender3 = $randDefender3;
$defender4 = $randDefender4;
echo "Goalkeeper: " . ' ' . $goalkeeper . ' ' . "<br />";
echo "Defender: " . ' ' . $defender1 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender2 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender3 . ' ' . "<br />";
echo "Defender: " . ' ' . $defender4 . ' ' . "<br />";

如果你是shuffle()数组,你可以写你的算法在一种方式,你不必担心重新随机化。每次它被洗牌时,它的顺序都会不同——所以你可以使用数组中的第一项和第二项,它们保证是不同的。您可以使用$defenders[0]$defenders[1]来取出它们,或者使用array_pop()从数组中取出一个元素。如果您编写的代码事先不知道需要多少,这种方法特别有用,因为您不需要维护计数。只要加载你的防守者列表,shuffle()它,并使用array_pop()在必要时获得不同的防守者。

您可以通过让array_rand为您选择所有值来解决这个问题。

$defenders = array_rand(f_contents_defenders, 4);

现在回答你的问题,我必须先修正一个错误。$f_contents_defenders[array_rand($f_contents_defenders)]语句没有意义。array_rand($f_contents_defenders)的结果已经是一个值,所以不需要索引它。

一旦你解决了这个问题,你有:$randDefender1 = array_rand($f_contents_defenders);//在randDefender1变量中添加一个随机的防御者$randDefender2 = array_rand($f_contents_defenders);//添加一个随机的防御者到randDefender2

要确保你第二次得到的总是不同的,你可以这样做:

while ($randDefender1 == $randDefender2) {
    $randDefender2 = array_rand($f_contents_defenders); // Add a random defender to the randDefender2
}

等等。确保你有2个以上的防守者,否则你会陷入循环。

当你去3号和4号位时,你需要像这样检查之前所有的防守者:

while ($randDefender3 == $randDefender1 || $randDefender3 == $randDefender2)

如果没有,您可以得到这样的情况:

  • 后卫C
  • 后卫
  • 后卫C
  • 后卫

我强烈建议你使用array_rand()来抓取你的所有东西,硬汉。

更漂亮的做法:

// Goalkeeper
$f_contents_goalkeepers = file("goalkeepers.txt"); // Load the Goalkeepers Database and add it to an array
shuffle($f_contents_goalkeepers); // Shuffle the contents of the array
$randGoalkeeper = $f_contents_goalkeepers[array_rand($f_contents_goalkeepers)]; // Add a random goalkeeper to the randGoalkeeper variable
$goalkeeper = $randGoalkeeper; // Set the Goalkeeper variable to use the random goalkeeper
//
// Defender
$f_contents_defenders = file("defenders.txt"); // Load the Defenders Database and add it to an array
$def_cnt = count($f_contents_defenders)-1;
if($def_cnt < 3)
    die('You need 4 or more defenders');
$def_rand = array();
for($i = 0; $i < 4; ++$i)
{
    $rand_numb = rand(0, $def_cnt);
    while(isset($def_rand[$rand_numb]))
    {
        $rand_numb = rand(0, $def_cnt);
    }
    $def_rand[$rand_numb] = $f_contents_defenders[$rand_numb];
}
$def_rand = array_values($def_rand);
print_r($def_rand);