Как сделать генератор случайных строк, который не повторяет строки - PullRequest
1 голос
/ 11 апреля 2020

Я разрабатываю веб-страницу «Никогда не бывал когда-либо», которая генерирует сценарий «Никогда не бывал когда-либо» ios каждый раз, когда пользователь нажимает кнопку.

Я создал генератор, но с проблемой, с которой я сейчас столкнулся с тем, что генератор продолжает повторять одни и те же строки после нескольких щелчков.

Есть ли способ, который бы рандомизировал, какая строка была выбрана, но затем не выбирал эту строку снова?

 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];
}

Ответы [ 4 ]

1 голос
/ 11 апреля 2020

Вы можете использовать .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>

Возможно, вы можете добавить дополнительную проверку, если у вас нет больше элементов в массиве.

Надеюсь, это поможет!

0 голосов
/ 11 апреля 2020

Что вам действительно нужно, так это перемешать массив и pop из него. Таким образом, значение не доступно для следующей итерации. rando js .com делает такие простые вещи случайности как этот простой, поэтому я использовал это в этом ответе.

//define scenarios
var scenarios = ['Never Have I Ever 1', 'Never Have I Ever 2', 'Never Have I Ever 3'];

//make a shuffled copy of scenarios
var shuffledScenarios = randoSequence(scenarios);

function generate(){
  //refill the shuffled array if needed
  if(shuffledScenarios.length == 0) shuffledScenarios = randoSequence(scenarios);
  
  //remove a value from the shuffled array and output it
  console.log(shuffledScenarios.pop().value);
}
<script src="https://randojs.com/1.0.0.js"></script>
<button onclick="generate()">Show the next one</button>

Как я уже сказал, в этом ответе используется rando js, поэтому, если вы хотите использовать этот ответ, просто убедитесь, что вы включили его в тег head Ваш HTML документ в верхней части страницы:

<script src="https://randojs.com/1.0.0.js"></script>

Если у вас есть какие-либо вопросы, оставьте мне комментарий!

0 голосов
/ 11 апреля 2020

Вы можете сделать это, поддерживая объект ha sh. Где вы сохраняете значения индекса, которые уже были отображены, и генерируете случайный индекс, пока не будет сгенерировано уникальное значение индекса.

 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>
0 голосов
/ 11 апреля 2020

Вы можете создать функцию генератора, которая создает 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);
...