从数组中获取随机元素,显示它,然后循环-但永远不要跟在同一个元素后面
Get random element from array, display it, and loop - but never followed by the same element
我写了一个足够简单的随机化函数,它循环遍历数组中的元素,并一个接一个地显示它们。
请在此处查看。
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);
}
然而,很明显,同一元素被显示两次是非常可能的,一次紧接着另一次。之所以会发生这种情况,是因为每次调用函数时都会对数组进行随机化。如何防止一个元素前后显示两次?
我想最简单的方法是将随机化函数从循环中取出,运行循环,每次调用元素时,从数组中删除索引,并在数组为空时重新填充。SO上的很多问题都考虑了这个问题,但没有我的问题那么具体:我不知道如何在循环中显示每个元素。
请停止向上投票:-D
以下答案更好:https://stackoverflow.com/a/32395535/1636522.我和蒂姆之间的深入讨论启发了你为什么应该避免使用我的解决方案。我的答案只是从这个角度来看很有趣,因此,它不值得任何支持:-D
你可以保存最后一个整数;而";直到下一个不同:
var i, j, n = 10;
setInterval(function () {
while ((j = Math.floor(Math.random() * n)) === i);
document.write(j + ' ');
i = j;
}, 1000);
或者更简单,只需添加1…:-D Modulo n即可防止索引溢出:
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>
要使除前一个元素外的所有元素都有机会使用,请执行以下操作:
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,并且我们选择第三个元素。
您可以在i为0、i为2的情况下进行同样的遍历,以确保它永远不会超出缓冲区,并且始终有平等的机会选择所有其他元素。
然后,您可以将相同的逻辑扩展到任何大小的数组。它的工作方式完全相同。
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();
试试这个方法。
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何设置html元素填充的动画
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 表追加而不附加最后一个元素
- 如何在jQuery中获取元素的形式
- 我可以获得相对于被点击元素的确切点击位置吗
- 在函数中添加数组元素的数值
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 将视口底部滚动到元素底部
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何使用jquery处理php循环通过元素
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- 如何创建一个RxJS缓冲区,将NodeJS中的元素分组,但不依赖于永远运行的间隔
- iOS Safari似乎永远不会触发滚动事件,如果鼠标下的元素只有"overflow-y: scroll&qu
- 从数组中获取随机元素,显示它,然后循环-但永远不要跟在同一个元素后面
- JavaScript HtmlCollection循环永远不会返回第二个元素