作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试更改以下内容(当前从数组返回一个随机数),以便每个随机数都与最后一个选择的随机数不同。
function randomize(arr) {
return arr[Math.floor(Math.random()*arr.length)];
}
oracleImg = [];
for (var i=1;i<=6;i++) {
oracleImg.push(i);
}
randOracleImg = randomize(oracleImg);
我尝试了以下方法,但它并不总是给我一个与上一个数字不同的数字。
function randomize(arr) {
var arr = Math.floor(Math.random()*arr.length);
if(arr == this.lastSelected) {
randomize();
}
else {
this.lastSelected = arr;
return arr;
}
}
我该如何解决这个问题?
最佳答案
您现有函数的递归 randomize()
调用没有意义,因为您没有将 arr
参数传递给它并且您没有对其返回做任何事情值(value)。该行应该是:
return randomize(arr);
...除了当它到达该行时您已重新分配 arr
以便它不再引用原始数组。在以下版本中使用附加变量应该可行。
请注意,我还添加了一项测试,以确保如果数组只有一个元素,我们会立即返回该项目,因为在这种情况下,不可能每次都选择不同的项目。 (如果数组为空,函数返回 undefined
。)
function randomize(arr) {
if (arr.length < 2) return arr[0];
var num = Math.floor(Math.random()*arr.length);
if(num == this.lastSelected) {
return randomize(arr);
} else {
this.lastSelected = num;
return arr[num];
}
}
document.querySelector("button").addEventListener("click", function() {
console.log(randomize(["a","b","c","d"]));
});
<button>Test</button>
请注意,您的原始函数似乎返回一个随机数组 index,但我的答案中显示的代码返回一个随机数组 element。
另请注意,您调用函数的方式意味着在函数内 this
是窗口 - 不确定这是否是您想要的;它有效,但基本上 lastSelected
是一个全局变量。
鉴于我不热衷于不必要地创建全局变量,这里有一个没有全局变量且没有递归的替代实现,因为在我看来,一个简单的 while 循环是一种更语义化的方式来实现“继续尝试直到”的概念x 发生了”:
var randomize = function () {
var lastSelected, num;
return function randomize(arr) {
if (arr.length < 2) return arr[0];
while (lastSelected === (num = Math.floor(Math.random()*arr.length)));
lastSelected = num;
return arr[num];
};
}();
document.querySelector("button").addEventListener("click", function() {
console.log(randomize(["a","b","c","d"]));
});
<button>Test</button>
关于javascript - 如何生成一个新的随机数(与之前的随机数不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312831/
我是一名优秀的程序员,十分优秀!