Javascript:在范围内生成随机数,避免前两个
Javascript: generate random numbers in range, avoiding previous two
我正在创建一个包含 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
这意味着现在所有三个变量prev1
、prev2
和rand
都是相同的。只需删除第二个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;
}
}());
相关文章:
- 如果在过去两个小时内没有记录,返回0,javascript逻辑
- 如何从日期范围选择器中获取两个日期
- 在两个浏览器选项卡之间共享变量范围
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 在两个括号内插入文本 - Javascript
- 连接angularjs中的两个范围模型
- 如何匹配两个字符内的重复模式
- 正则表达式用于验证两个范围之间的数字
- Javascript:在范围内生成随机数,避免前两个
- 获取两个跨度内的数字并进行计算
- 无论哪一天,如何获得两个小时范围内的时间
- Google 应用脚本:返回 2 个两个范围之间唯一值的函数
- 生成两个范围之间的日期(js)
- 如何将两个范围值相加,然后乘以一个select标记
- 循环遍历两个id内的所有元素
- 在javascript中获取两个范围之间的交集
- 在morris.js折线图中绘制两个范围的y轴
- 同时更改两个范围- javascript
- 基于级别数组协调两个范围输入
- 是否可以在一个简短的内联事件中滑动两个范围输入元素