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)
因为在每个条目被随机选择之前没有多次选择任何条目.(第二个循环在第二个"广告"开始,以防你没有发现差异.
但是你可以从我上面发布的代码中看到,我不知道该怎么做.我已经看到了随机选择的条目实际上从数组中完全删除的示例,但这不是我想要做的.我只想要选择每个条目一次,然后重新启动进程.
有谁知道这个代码?
您可以使用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)
一个非常简单的方法是每次选择一个随机元素时使用拼接,一旦数组为空,用原始值重新填充它.
示例:
(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)
如果您不介意数组更改,您可以随机化数组中元素的顺序,然后从第一个元素到最后一个元素打印数组。
或者
您可以创建另一个值为 1 到 N 的数组(其中 n 是元素数量)。随机化该数组的顺序,然后在从第一个到最后一个迭代数组时将其用作数组的索引。