【问题标题】:PHP generate random shuffled sequencePHP生成随机打乱序列
【发布时间】:2017-05-21 22:40:05
【问题描述】:

我正在尝试生成一个随机数组(如果我使用正确的术语),有可能重复但不相邻,并且在给定数组之外。

带变量的例子:狮子老虎熊猴子大象

我希望能够制作一条线,但有以下可能性:“狮子、老虎和熊”或“熊和狮子、猴子和大象”或“猴子和大象”或“大象、狮子和大象和老虎”

所以它需要随机数量的可能性(不少于两个 - 所以“熊和老虎”和任何其他具有两个选项的产品将是最小值 - 但也不超过七个。) ,我希望变量可以被复制,但不能彼此相邻,所以像“猴子和狮子、老虎和猴子”这样的东西是可能的。

由于我对 PHP 了解不多,这只是我尝试过的选项之一:

<?php 
$input_array = array("lions", "tigers", "bears", "monkeys", "elephants");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>

但由于它只生成静态数量的两个元素并且不会重复,它并不能完全产生我想要做的事情。

任何帮助将不胜感激,特别是如果它包含用于在每个变量之间放置单词“and”并打印它们的代码(而不是生成算法) - PHP 对我来说很新,我不确定如何在不搞砸的情况下做到这一点。

【问题讨论】:

  • 尽管您提供了几行代码,但这似乎更像是请求编写代码而不是请求帮助修复代码。尝试一些代码,在其中生成一个 2 到 7 之间的数字,然后循环遍历那些随机多次的 input_array 值
  • @RST:感谢您的建议!我设法获得了一个更好的工作代码,涵盖了我最初尝试做的事情,但我现在仍然遇到重复值的问题。

标签: php arrays random


【解决方案1】:

输入:

$input_array=["lions","tigers","bears","monkeys","elephants"];

方法:

$count=mt_rand(2,7);                  // declare number of elements to extract
echo "Count = $count\n";              // display expected element count

$result=[];
while(sizeof($result)<$count){        // iterate until count is fulfilled
    if(($new_val=$input_array[array_rand($input_array)])!=end($result)){
        $result[]=$new_val;           // add new value if different from previous value
    }
}
echo implode(' and  ',$result);       // display values (joined by ' and ')

一些潜在的输出:

Count = 6
monkeys and tigers and bears and tigers and monkeys and bears

Count = 2
elephants and lions

Count = 7
lions and bears and lions and elephants and monkeys and elephants and lions

【讨论】:

  • 完美运行!非常感谢。
  • @pie 不用担心。关于我的方法,一切都清楚了吗?如果您想进一步解释任何内容,请询问。
  • 有道理——这对我以后肯定会有所帮助:)
【解决方案2】:

所以你想要做的是:

首先你需要设置应该有多少洗牌的元素。

$num = rand(2,7); // get random number between 2 and 7

然后你迭代你的 $input_array 很多次。还要检查其中的最后一个条目是否等于新添加的条目,在这种情况下,跳过迭代并再次掷骰子。

$rand_keys = array();
while($num>0){ // repeat as long as $num is not zero
    $rand_key = $input_array[rand(0,count($input_array)-1)]; // select random key from input_array
    if(count($rand_keys)==0 || $rand_keys[count($rand_keys)-1]!=$rand_key){ // check if either this is the first element to add, or if the last element added is not equal to the new one
        $rand_keys[] = $rand_key; // push new key into rand_keys
        $num--;
    }
}

现在您的 $rand_keys 数组应该包含所需的随机键。

PS:要将此数组转换为示例中的字符串,请使用implode(' and ',$rand_keys);

【讨论】:

  • 无需进行所有计数。 Input_array 没有改变,所以不需要每次迭代都指望。也不需要计算 rand_keys 数组,因为您可以使用 $num 跟踪相同的信息。
  • @ManuelOtto 谢谢!实际上,我设法得到了生成器(我编辑了我的问题)并尝试输入您为检查重复项所做的工作,但如果您想查看它,它并不完全有效。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2015-10-27
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多