我有一些代码,可以根据来自不同数组的先验参数生成一个随机输出
数据设置:
$persons = array("Old", "Young", "Child");
$moods = array("neutral", "happy", "sad");
$newarray= "";
shuffle($persons );
$persons2 = array_merge(...array_fill(1, 92, $persons ));
$persons2 = $array = array_slice($persons2, 1, 30);
shuffle($moods);
$moods2 = array_merge(...array_fill(1, 92, $moods));
$moods2 = $array = array_slice($moods2, 1, 30);
所需的输出是一个if循环,它生成由等量的old、young和child对象组成的字符串,这些对象中的每一个都是等量的中性、快乐和悲伤对象,类似于
for ($x = 0; $x <= 30; $x++) {
$mood = $moods2[$x % (count($moods2))];
$person = $persons2 [$x % (count($persons2))];
$newarray .= "|".$person.",".$mood."|";
}
这段代码的问题是,它不能确保情绪“快乐”、“悲伤”、“中性”与人物类别“年老”、“年轻”、“儿童”均匀地组合。
$newarray= "|Old,happy||Old,sad||Old,netrual||Young,happy||Young,sad||Young,netrual||Child,happy||Child,sad||Child,neutral|";
使得存在30次迭代并且可能的人/情绪组合同样频繁地出现。
并不是说我也希望最终的输出是随机排序的,并且即使改变for循环的迭代次数,代码也应该工作。
2条答案
按热度按时间uujelgoq1#
填充笛卡尔积,然后根据需要循环多次,并使用循环索引访问(通过模数计算)获取混洗数组中的下一个元素。
代码:(Demo)
ugmeyewa2#
你要做的是创建一个所有可能的输入排列的集合,然后用排列的集合填充一个所需大小的数组,然后 Shuffle 。
您可以使用一个类来创建笛卡尔积,以一种更通用和更可重用的方式(并支持任意数量的输入集,而不仅仅是两个)来实现这一点。