首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从一个数组中随机选择元素,每个元素只被选择一次?

如何从一个数组中随机选择元素,每个元素只被选择一次?
EN

Stack Overflow用户
提问于 2018-06-06 04:09:15
回答 5查看 88关注 0票数 -3

下面的数组包含一个竞赛的条目。一些参与者比其他参与者显示得更多,因此他们参与其中的次数。

例如,"pounho“比"vinylin”有更好的机会。这就是为什么他在数组中比"vinylin“出现更多的原因。

我的问题是如何从下面的示例数组中选择3个结果,但结果必须是唯一的,没有重复?

因为目前,我可以显示3个结果,但有重复,例如deou, deou, pounho

我不想删除重复项。我希望代码考虑到参与者"pounho“比"vinylin”有更好的机会。

代码语言:javascript
复制
Array
(
    [0] => pounho
    [1] => pounho
    [2] => pounho
    [3] => panony
    [4] => mamich
    [5] => Deou
    [6] => Deou
    [7] => vinylin
    [8] => laids
    [9] => laids
)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-06 04:12:23

代码语言:javascript
复制
$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));
    }
}

更新答案,参与者在数组中的次数越多,他在随机挑选中的机会就越大,这是我能想象到的实现它的最简单的代码

票数 2
EN

Stack Overflow用户

发布于 2018-06-06 04:34:54

选择数组的一个随机元素,然后删除该元素的所有副本。这样做3次,得到3个不同的元素。

代码语言:javascript
复制
$results = array();
for ($i = 0; $i < 3; $i++) {
    $index = array_rand($array);
    $selected = $array[$index];
    $results[] = $selected;
    $array = array_diff($array, array($selected));
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 04:43:35

不确定效率,特别是对于大型数组,但是;检索前3个值并检查它们是否唯一。如果不是唯一的,请随机播放,然后重试。频率较高的值更有可能出现在前3位:

代码语言:javascript
复制
while(count($result = array_unique(array_slice($array, 0, 3))) < 3){ shuffle($array); }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50708175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档