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

时间:2011-01-26 23:19:33

标签: javascript arrays actionscript-3 flash random

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

chosenUser = usersOnlineArray[Math.round((Math.random()*usersOnlineArray.length))];

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

我将如何使用该代码,但告诉它“记住,确保你不选择用户ID”

也许我可以做点像

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

使用 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 :(得分:0)

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