我编写了一个足够简单的randomize函数,它循环遍历数组中的元素并一个接一个地显示它们。
function changeSubTitle() {
var whatAmI = ["Webdesigner", "Drummer", "Techie", "Linguistics student", "Photographer", "Geek", "Coder", "Belgian", "Batman", "Musician", "StackExchanger", "AI student"];
setTimeout(function () {
$(".page-header > h2").animate({
"opacity": 0
}, 700, function () {
$(this).text(whatAmI[Math.floor(Math.random() * whatAmI.length)]);
$(this).animate({
"opacity": 1
}, 700, changeSubTitle);
});
}, 1000);
}
然而,显然很可能同一个元素显示两次,一个紧接着另一个。这是因为我每次调用函数时都会随机化数组。如何防止元素相继显示两次?
我认为最直接的方法是让randomize函数 out 循环,运行循环,每次调用一个元素时,从数组中删除索引并重新填充数组当它是空的。关于SO的很多问题都考虑了这个问题,但不像我的那样具体:我不知道如何在循环中执行此操作来显示每个元素。
答案 0 :(得分:3)
请停止投票:-D
以下答案更好:https://stackoverflow.com/a/32395535/1636522。我和蒂姆之间的extended discussion启发了为什么你应该避免使用我的解决方案。从这个角度来看,我的回答很有趣,因此,它不值得任何支持:-D
您可以保存最后一个整数和“while”,直到下一个整数不同:
var i, j, n = 10;
setInterval(function () {
while ((j = Math.floor(Math.random() * n)) === i);
document.write(j + ' ');
i = j;
}, 1000);
甚至更简单,只需添加1 ...: - D模数以防止索引溢出:
var i, j, n = 10;
setInterval(function () {
j = Math.floor(Math.random() * n);
if (j === i) j = (j + 1) % n;
document.write(j + ' ');
i = j;
}, 1000);
第一个解决方案应用于您的代码:
var whatAmI = ["Webdesigner", "Drummer", "Techie", "Linguistics student", "Photographer", "Geek", "Coder", "Belgian", "Batman", "Musician", "StackExchanger", "AI student"];
var j;
var i = 1; // since you start with "Drummer"
var n = whatAmI.length;
function changeSubTitle() {
setTimeout(function () {
while ((j = Math.floor(Math.random() * n)) === i);
$(".page-header > h2").animate({
"opacity": 0
}, 700, function () {
$(this).text(whatAmI[j]);
$(this).animate({
"opacity": 1
}, 700, changeSubTitle);
});
}, 1000);
i = j;
}
changeSubTitle();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header class="page-header">
<h1>Bananas</h1>
<h2>Drummer</h2>
</header>
答案 1 :(得分:1)
为了使除前一个元素之外的所有元素均匀使用,请执行以下操作:
var i, j, n = 10;
setInterval(function () {
// Subtract 1 from n since we are actually selecting from a smaller set
j = Math.floor(Math.random() * (n-1));
// if the number we just generated is equal to or greater than the previous
// number then add one to move up past it
if (j >= i) j += 1;
document.write(j + ' ');
i = j;
}, 1000);
代码中的注释应解释其工作原理。要记住的关键是你实际上是从9个可能的值中选择,而不是从10个。
在开始之前,你应该将i初始化为数组中的随机元素。
对于选择了第二个元素的3元素数组的简单演练:
i=1, n=3
随机结果给出0或1。
如果为0,则j >= i
返回false,我们选择元素零
如果为1则j >= i
返回true,我们选择第三个元素。
你可以做同样的步骤,我是0而且我是2,看它永远不会超出缓冲区,并且总是有平等机会选择所有其他元素。
然后,您可以将相同的逻辑扩展到任何大小的数组。它的工作原理完全相同。
答案 2 :(得分:0)
var whatAmI = ["Webdesigner", "Drummer", "Techie", "Linguistics student", "Photographer", "Geek", "Coder", "Belgian", "Batman", "Musician", "StackExchanger", "AI student"];
var prev = 1; //1 because "drummer" is the first array element displayed in the HTML
function getIndex(){
var next = Math.floor(Math.random() * whatAmI.length);
if(next==prev)
return getIndex();
else {
prev = next;
return next;
}
}
function changeSubTitle() {
setTimeout(function () {
$(".page-header > h2").animate({
"opacity": 0
}, 700, function () {
$(this).text(whatAmI[getIndex()]);
$(this).animate({
"opacity": 1
}, 700, changeSubTitle);
});
}, 1000);
}
changeSubTitle();
尝试这种方法。