gpt4 book ai didi

javascript - 如何生成一个新的随机数(与之前的随机数不同)

转载 作者:行者123 更新时间:2023-11-30 09:44:47 25 4
gpt4 key购买 nike

我正在尝试更改以下内容(当前从数组返回一个随机数),以便每个随机数都与最后一个选择的随机数不同。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com