如何制作不重复字符串的随机字符串生成器

问题描述 投票:0回答:3

我正在开发一个“从未有过的”网页,每当用户单击按钮时,都会生成“从未有过的脚本”。

我已经制作了生成器,但是现在面临的问题是,单击几次后,生成器会不断重复相同的字符串。

是否有任何方法可以随机化已选择的字符串,但随后不再选择该字符串?

 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];
}
javascript arrays random generator
3个回答
1
投票

您可以使用.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();

如果阵列中没有更多项目,可能会添加额外的检查。

我希望这会有所帮助!


0
投票

您可以通过维护哈希对象来实现。您保存已显示的索引值的位置,并在不生成唯一索引值之前生成随机索引。

<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++;
});

0
投票

您可以创建一个生成器函数,该函数创建<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);
© www.soinside.com 2019 - 2024. All rights reserved.