下面的数组包含一个竞赛的条目。一些参与者比其他参与者显示得更多,因此他们参与其中的次数。
例如,"pounho“比"vinylin”有更好的机会。这就是为什么他在数组中比"vinylin“出现更多的原因。
我的问题是如何从下面的示例数组中选择3个结果,但结果必须是唯一的,没有重复?
因为目前,我可以显示3个结果,但有重复,例如deou, deou, pounho
。
我不想删除重复项。我希望代码考虑到参与者"pounho“比"vinylin”有更好的机会。
Array
(
[0] => pounho
[1] => pounho
[2] => pounho
[3] => panony
[4] => mamich
[5] => Deou
[6] => Deou
[7] => vinylin
[8] => laids
[9] => laids
)
发布于 2018-06-06 04:12:23
$inputArray = [...];
$backuppedArray = $inputArray;
$randomlySelected = [];
while(count($randomlySelected) < 3 && count($backuppedArray) > 0){
$randomItem = $backuppedArray[array_rand($backuppedArray)];
if(!in_array($randomItem, $randomlySelected)){
$randomlySelected []= $randomItem;
$backuppedArray = array_diff($backuppedArray, array($randomItem));
}
}
更新答案,参与者在数组中的次数越多,他在随机挑选中的机会就越大,这是我能想象到的实现它的最简单的代码
发布于 2018-06-06 04:34:54
选择数组的一个随机元素,然后删除该元素的所有副本。这样做3次,得到3个不同的元素。
$results = array();
for ($i = 0; $i < 3; $i++) {
$index = array_rand($array);
$selected = $array[$index];
$results[] = $selected;
$array = array_diff($array, array($selected));
}
发布于 2018-06-06 04:43:35
不确定效率,特别是对于大型数组,但是;检索前3个值并检查它们是否唯一。如果不是唯一的,请随机播放,然后重试。频率较高的值更有可能出现在前3位:
while(count($result = array_unique(array_slice($array, 0, 3))) < 3){ shuffle($array); }
https://stackoverflow.com/questions/50708175
复制相似问题