Javascript 如何在数组中选择随机元素以避免(除非是)某个值?

Javascript 如何在数组中选择随机元素以避免(除非是)某个值?,javascript,arrays,actionscript-3,flash,random,Javascript,Arrays,Actionscript 3,Flash,Random,例如,当用户连接到此应用程序时,会给他们一个userid变量,然后将其插入到数组中。所以,我正在使用 chosenUser=usersOnlineArray[Math.roundMath.random*usersOnlineArray.length] 选择另一个随机用户。但我需要确保它不会选择他们个人分配的用户ID,这样他们就不会最终得到自己的用户ID 我将如何使用该代码,但告诉它记住,确保您不选择userid 也许我可以做点像 chosenUser = usersOnlineArray[Mat

例如,当用户连接到此应用程序时,会给他们一个userid变量,然后将其插入到数组中。所以,我正在使用

chosenUser=usersOnlineArray[Math.roundMath.random*usersOnlineArray.length]

选择另一个随机用户。但我需要确保它不会选择他们个人分配的用户ID,这样他们就不会最终得到自己的用户ID

我将如何使用该代码,但告诉它记住,确保您不选择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
    }
也许这需要一段时间chosenUser=userid,以防它得到两次

但是,我想如果有一种有效的方法来确保它一开始就不会选择它,我可以跳过所有这些


对不起,我不太确定我该如何表达这个问题,或者是否有一个我不知道的术语来指代我正在尝试做的事情

您的方法很好,例如,只需再次调用您的方法

public void Something(){ string user = GetUser(); }
public string GetUser(){
   chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];

  if (chosenUser == userid)
  {
    return GetUser();
  } 
return chosenUser;
}
使用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);

由于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];
};

是的,我会这样做的。你需要确保至少有一个用户在线,否则你将有无限递归。必须使用比较==非赋值=我已经更新了它,但我不知道他在说什么语言,只是算法如何解决问题这是递归的,你不应该使用它,因为它比较慢,最好的方法是使用do..while循环注意:只有在列表中没有重复元素时,此方法才有效