Javascript:在范围内生成随机数,避免前两个

Javascript: generate random numbers in range, avoiding previous two

本文关键字:两个 范围内 随机数 Javascript      更新时间:2023-09-26

我正在创建一个包含 6 张幻灯片的滑块,我想在它们之间随机移动,确保前两张幻灯片都不会显示为下一张幻灯片。功能并不重要,因为我真正要做的是生成随机数并跟踪前两个。第一张幻灯片的编号始终为 1,因此对于前两次迭代,这将是前面不能使用的编号之一。

这是我到目前为止所拥有的,它可以很好地生成范围内的随机数,但是"缓存"最后两个值并不可靠:

        var rand = Math.floor(Math.random() * 6) + 1;
        var prev1 = 1;
        var prev2;
        function randomSlide() {
            // 5 second interval between slides
            // Don't show either of previous two slides next
            random = setInterval(function() {
                prev2 = prev1;
                prev1 = rand;
                do {
                    rand = Math.floor(Math.random() * 6) + 1;
                } while (rand == prev1 || rand == prev2);
                prev1 = rand;
                $('#slider').anythingSlider(rand);
                //console.log(prev1,prev2);

            }, 5000);
        }
        function firstSlide() {
            firstTime = setTimeout(function() {
                randomSlide();
            }, 5000);
        }
        firstSlide();            
        randomSlide();

我认为这很简单,但我的大脑在第一次解析两个"缓存"变量的值时变得疲惫不堪,然后是每次后续迭代。

我在开始时执行单个迭代,因为如果 randomSlide() 在加载时执行,那么第一张(欢迎)幻灯片就没有机会显示。

更改 rand 的值后第二次执行prev1 = rand时,将为其分配新幻灯片的编号。下次你进入循环时,你会prev2 = prev1,因为prev1 == rand这意味着现在所有三个变量prev1prev2rand都是相同的。只需删除第二个prev1 = rand即可。

另一个问题是你设置了两次间隔:首先你调用firstSlide(),它在 5 秒延迟后randomSlide()执行(设置一个间隔),然后在你再次调用randomSlide()之后立即设置另一个间隔。

这是另一种(更简单?)获得结果的方法:

<script>
// Return a random number from 1 to 6, exclude 
// the last two numbers.
var getRandom = (function() {
  var a = [1,2,3,4,5,6];
  return function() {
    var i = (Math.random() * 4 ) | 0;
    a[5] = a.splice(i,1);
    return a[5];
  }
}());
function writeRandom() {
  document.getElementById('d0').innerHTML += getRandom() + '<br>';
}
setInterval(writeRandom, 100)
</script>
<div id="d0"></div>

前 2 次迭代并不完全随机,但您可以通过在初始化时随机化数组来解决此问题。但对于幻灯片放映来说,这可能无关紧要。

它的代码较少,但拼接部分使它在我测试的浏览器中变慢。我的OP版本是:

var getRandom2 = (function() {
  var r0 = r1 = r2 = 1;
  return function() {
    r0 = r1;
    r1 = r2;
    do {
      r2 = Math.floor(Math.random() * 6) + 1;
    } while (r2 == r0 || r2 == r1);
    return r1;
  }
}());