javascript - 从数组中获取随机元素,显示它,然后循环 - 但从不跟随相同的元素

标签 javascript arrays random

我写了一个足够简单的随机化函数,循环遍历数组中的元素并一个接一个地显示它们。

See it here.

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 . extended discussion我和蒂姆之间的对话启发了为什么你应该避免使用我的解决方案。从这个 Angular 来看,我的回答很有趣,因此,它不值得任何赞成票:-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 模 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>

关于javascript - 从数组中获取随机元素,显示它,然后循环 - 但从不跟随相同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32394796/

相关文章:

javascript - Sinon stub 定义在同一文件中的函数

javascript - 如何在 Javascript 中使用表数据传递输入值

php - 将数组放入 PHP 中的 WHERE 子句而不命中 X 次 Postgres

javascript - 如何从基于对象数组内部的对象数组返回值的总和

javascript - 在 JavaScript 中创建一个介于 -100 和 100 之间的随机数?

r - 从指数分布生成随机数

javascript - 模式弹出窗口不断在网格图片的每个按钮上显示第一条记录

javascript - 未捕获的类型错误 : Cannot read property 'geocode' of undefined

c - 如何找到分隔数组中元素的常量值

java - 如何从 JVM 获取熵?