我正在开发一个“从未有过的”网页,每当用户单击按钮时,都会生成“从未有过的脚本”。
我已经制作了生成器,但是现在面临的问题是,单击几次后,生成器会不断重复相同的字符串。
是否有任何方法可以随机化已选择的字符串,但随后不再选择该字符串?
var scenario = [
'Never Have I Ever 1',
'Never Have I Ever 2',
'Never Have I Ever 3',
'Never Have I Ever 4',
'Never Have I Ever 5',
'Never Have I Ever 6',
'Never Have I Ever 7',
'Never Have I Ever 8',
'Never Have I Ever 9',
'Never Have I Ever 10',
'Never Have I Ever 11',
'Never Have I Ever 12',
'Never Have I Ever 13',
'Never Have I Ever 14',
'Never Have I Ever 15',
'Never Have I Ever 16',
'Never Have I Ever 17',
'Never Have I Ever 18'
]
function generate() {
var randomNumber = Math.floor(Math.random() * (scenario.length));
document.getElementById("sentence").innerHTML = scenario[randomNumber];
}
您可以使用.filter()
,根据显示后从阵列中基于所选.filter()
的索引来删除项目:
randomNumber
let scenario = ['Never Have I Ever 1', 'Never Have I Ever 2', 'Never Have I Ever 3', 'Never Have I Ever 4', 'Never Have I Ever 5', 'Never Have I Ever 6', 'Never Have I Ever 7', 'Never Have I Ever 8', 'Never Have I Ever 9', 'Never Have I Ever 10', 'Never Have I Ever 11', 'Never Have I Ever 12', 'Never Have I Ever 13', 'Never Have I Ever 14', 'Never Have I Ever 15', 'Never Have I Ever 16', 'Never Have I Ever 17', 'Never Have I Ever 18'];
function generate() {
const randomNumber = Math.floor(Math.random() * (scenario.length));
let sentence = 'No more sentences';
if (scenario.length > 0) {
sentence =
scenario[randomNumber];
scenario = scenario.filter((e, i) => i !== randomNumber);
console.log('length of remaining scenario items:', scenario.length);
}
document.getElementById("sentence").innerHTML = sentence;
}
generate();
如果阵列中没有更多项目,可能会添加额外的检查。
我希望这会有所帮助!
您可以通过维护哈希对象来实现。您保存已显示的索引值的位置,并在不生成唯一索引值之前生成随机索引。
<div id="sentence"></div>
<button onclick="generate()">Generate new sentence</button>
let scenario = ['Never Have I Ever 1', 'Never Have I Ever 2', 'Never Have I Ever 3', 'Never Have I Ever 4', 'Never Have I Ever 5', 'Never Have I Ever 6', 'Never Have I Ever 7', 'Never Have I Ever 8', 'Never Have I Ever 9', 'Never Have I Ever 10', 'Never Have I Ever 11', 'Never Have I Ever 12', 'Never Have I Ever 13', 'Never Have I Ever 14', 'Never Have I Ever 15', 'Never Have I Ever 16', 'Never Have I Ever 17', 'Never Have I Ever 18'];
const btn = document.querySelector('#generator');
const display = document.querySelector('#display');
let hash = {};
let clickCount = 0;
btn.addEventListener('click', function(e) {
e.preventDefault();
const {length} = scenario;
let randomIndex = Math.floor(Math.random() * length);
while (hash[randomIndex] !== undefined) {
randomIndex = Math.floor(Math.random() * length);
}
if (clickCount > length) {
hash = {};
alert('Added all strings');
}
hash[randomIndex] = 1;
display.innerText += scenario[randomIndex] + "\n";
clickCount++;
});
您可以创建一个生成器函数,该函数创建<div id="display"></div>
<button id="generator">Generate</button>
并返回copy of quotes
。在每次通话中,获取随机的closure function
,然后从副本中删除number
表格副本。
element
function generate(scenario) {
let copy = [...scenario];
return function () {
const randomNumber = Math.floor(Math.random() * copy.length);
const data = copy[randomNumber];
copy.splice(randomNumber, 1);
return data;
};
}
const quotePre = document.getElementById("random-quote");
const scenario = ["Never Have I Ever 1","Never Have I Ever 2","Never Have I Ever 3","Never Have I Ever 4","Never Have I Ever 5","Never Have I Ever 6","Never Have I Ever 7","Never Have I Ever 8","Never Have I Ever 9","Never Have I Ever 10","Never Have I Ever 11","Never Have I Ever 12","Never Have I Ever 13","Never Have I Ever 14","Never Have I Ever 15","Never Have I Ever 16","Never Have I Ever 17","Never Have I Ever 18"];
const randomGenerator = generate(scenario);
setInterval(function () {
const quote = randomGenerator();
if (quote) quotePre.innerText = quote;
}, 1000);