随机数组选择,无需在JavaScript中选择两次

And*_*bol 7 javascript arrays random

所以,我试图从一个数组中选择一个随机条目,然后使它成为在选择每个条目之前不再选择特定条目.基本上,我不希望看到任何相同的条目,直到选择了数组中的所有条目.

所以如果这是我的阵列...

keywords =
[
 "ppc",
 "games",
 "advertise",
 "meta",
 "home",
 "gaming",
 "welcome"
]
var keyword = keywords[Math.floor(Math.random()*keywords.length)]
document.write(keyword);
Run Code Online (Sandbox Code Playgroud)

我不希望看到输出:

meta, advertise, home, meta, gaming, welcome, ppc, welcome
Run Code Online (Sandbox Code Playgroud)

因为meta在第二次被选中之后才被选中.我想看到更像的东西:

meta, advertise, gaming,ppc, welcome, home, games, advertise, ppc,
Run Code Online (Sandbox Code Playgroud)

因为在每个条目被随机选择之前没有多次选择任何条目.(第二个循环在第二个"广告"开始,以防你没有发现差异.

但是你可以从我上面发布的代码中看到,我不知道该怎么做.我已经看到了随机选择的条目实际上从数组中完全删除的示例,但这不是我想要做的.我只想要选择每个条目一次,然后重新启动进程.

有谁知道这个代码?

Mar*_*nol 8

您可以使用Array.sort()函数对其进行随机排序.

// random sort function
function shuffle(a, b)
{
   return Math.random() > 0.5 ? -1 : 1;
}

var keywords = ["ppc", "games", "advertise", "meta", "home", "gaming", "welcome"];

var randomKeywords = keywords.sort(shuffle); // new instance of a sorted randomly copy of the array

alert(randomKeywords);
Run Code Online (Sandbox Code Playgroud)

更新:

更好的改组解决方案是使用Fisher-Yates Shuffle,如本答案中所示.

function shuffle(array)
{
  var m = array.length, t, i;
  while (m > 0) 
  {
	i = Math.floor(Math.random() * m--);
	t = array[m];
	array[m] = array[i];
	array[i] = t;
  }
  return array;
}

var keywords = ["ppc", "games", "advertise", "meta", "home", "gaming", "welcome"];

shuffle(keywords); // shuffles the array

alert(keywords);
Run Code Online (Sandbox Code Playgroud)


HoL*_*ieR 5

一个非常简单的方法是每次选择一个随机元素时使用拼接,一旦数组为空,用原始值重新填充它.

示例:

(function () {
    var arr = [];

    window.getRandomThing = function () {
        if (arr.length === 0) {
            refill();
        }

        return arr.splice(Math.random() * arr.length, 1)[0];
    };

    function refill () {
        arr = [1,2,3,4,5];
    }
} ());
Run Code Online (Sandbox Code Playgroud)


Hog*_*gan 1

如果您不介意数组更改,您可以随机化数组中元素的顺序,然后从第一个元素到最后一个元素打印数组。

或者

您可以创建另一个值为 1 到 N 的数组(其中 n 是元素数量)。随机化该数组的顺序,然后在从第一个到最后一个迭代数组时将其用作数组的索引。