如何在数组中随机选择一个元素,但要避免(除非它是)某个特定值?

4
例如,当用户连接到该应用程序时,他们会被分配一个userid变量,然后将其插入到数组中。因此,我正在使用
chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];
来选择另一个随机用户。但是我需要确保它不会选择他们个人分配的userID,以免他们最终得到自己。
我该如何使用该代码,但告诉它“记住,确保不要选择userid”?
也许我可以做类似的事情
chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];

    if (chosenUser = userid)
    {
        chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];
    } else
    {
    //next part of mycode
    }

也许应该这样写:while (chosenUser = userid) 这样,即使出现两次也不会有问题...但是,如果有一种有效的方法可以确保首先不会选择它,那么我认为我可以跳过所有这些步骤。抱歉,我不太确定我应该如何表达问题,或者是否有一个术语来引用我试图做的事情。
3个回答

3

使用Math.round()可能会导致返回"undefined",因为它允许选择未索引的usersOnlineArray.length。请改用Math.floor()

您可以将不想匹配的项目移动到数组的末尾,然后从除最后一个元素外的数组中随机选择一个元素:

//Users Array
var usersArray:Array = new Array("JoeID", "MaryID", "UserID", "JohnID", "SusanID");

//Find UserID And Push It To The End
usersArray.push(usersArray.splice(usersArray.indexOf("UserID"), 1));

//Randomly Select Companion From usersArray Except For UserID (Last Element)
var companion:String = usersArray[Math.floor(Math.random() * (usersArray.length - 1))];

trace(companion);

2
你已经走在正确的道路上了,只需要再调用一次你的方法,例如:
public void Something(){ string user = GetUser(); }
public string GetUser(){
   chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];

  if (chosenUser == userid)
  {
    return GetUser();
  } 
return chosenUser;
}

是的,这就是我会做的方式。但你需要确保检查至少有一个其他用户在线,否则你将会出现无限递归。 - StapleGun
必须使用比较运算符“==”,而不是赋值运算符“=”。 - Chunky Chunk
1
我已经更新了它,但我不知道他在谈论什么语言,只是解决问题的算法。 - Senad Meškin
这是递归的,你不应该使用它,因为它比较慢,最好的方法是使用 do..while 循环。 - user216441

-1

由于Flash与JavaScript属于同一ECMA语言分支,而且这里没有JS的答案(ActionScript也是一种已经灭绝的物种),因此以下是JS中的答案(不使用递归):

var getRandomExcept = function(elements, exceptElement){
    if(elements.length <= 0){
        return null;
    }else if(typeof exceptElement !== 'undefined' && elements.length == 1){
        if(elements[0] === exceptElement) return null;
    }

    var n = Math.floor(Math.random() * elements.length);

    if(elements[n] === exceptElement){
        // make one random trip around elements but stop (<elements.length) before the exceptElement
        n = (n + Math.floor(Math.random() * elements.length)) % elements.length;
    }
    return elements[n];
};

注意:仅当列表中的元素不重复时,此方法才有效。 - mPrinC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接