2015-03-27 5 views
0

У меня есть веб-сайт, который даст вам случайный факт из Википедии, когда вы нажмете на большую красную кнопку. Я слышал от нескольких людей, что они получают определенные факты неоднократно, несмотря на то, есть более 200.Лучший способ случайного вытягивания из массива?

Большая красная кнопка onclick="giveafact()" которая вызывает эту функцию:

function giveafact(){ //instead of relisting all array items here, add all the other arrays to this one 
    var factsList= foodFactsList.concat(musicFactsList,historyFactsList,popFactsList,sportsFactsList,technologyFactsList,televisionFactsList,miscFactsList); 
    randomFact = Math.floor(Math.random()*factsList.length); 
    document.getElementById("total").innerHTML=factsList.length; 
    document.getElementById("fact").innerHTML=factsList[randomFact]; 
    updateShareLinks(); 
    return false; 
} 

В принципе, у меня есть 8 различных массивов фактов, как вы можете видеть в var factsList выше. Это значит, что пользователь может фильтровать по факту. По умолчанию фильтр отсутствует, поэтому все списки объединены.

Если это помогает, полный .js-файл находится здесь: http://thewikifix.com/scripts/script.js. Эти случайные функции «дайте факты» начинаются примерно по строке 442 с массивами над ними. (Простите грязный код, я знаю, что я очень часто смешиваю jQuery и Javascript.)

Сайт http://thewikifix.com, если он помогает кому-либо взглянуть на весь код.

Я просто пытаюсь понять, есть ли способ лучше рандомизировать факты, чем в настоящее время, возможно, добавив функцию, которая не позволит факту появляться дважды в строке или что-то подобное.

Любые предложения были бы замечательными!

Редактировать - Дополнительные мысли: Спасибо за ответы до сих пор. Есть ли способ удалить элемент из массива после его выбора через функцию Math.random, чтобы он просто не отображался вообще (если страница не была обновлена)? Если это так, как только все элементы были удалены из массива, есть способ сбросить массив в исходное состояние без необходимости обновления? Благодарю.

+1

Возможный дубликат: http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array –

+0

Спасибо @ DanielA.White. Ссылка, приведенная там http://bost.ocks.org/mike/shuffle/, очень полезна. – Kyle

ответ

0

«Случайные» и «разнообразные» в какой-то мере противоречат друг другу. С 200 фактами, и каждый случайным образом выбирается каждый раз, становится более вероятно, что вы увидите повторение после получения всего пары дюжины или около того (это называется «проблема с днем ​​рождения»).

Простой подход - хранить семя и индекс на клиенте. Семя устанавливается один раз, и индекс увеличивается при каждом доступе к факту. Чтобы получить «случайный» факт, запустите PRNG с семенем, используйте PRNG, чтобы перетасовать список фактов, а затем получите факт по данному индексу в перетасованном списке. Когда вы закончите, выберите новое семя и сбросьте индекс.

0

Вот что я хотел бы сделать:

n = 0 - Find a random fact 
    add that fact to a new array (arr) 
    display fact 

n + 1 - Find a random fact 
    check arr using lodash for that facts existence 
    display or find a new fact, based on result of above 

--или--

вы могли бы взять обр и использовать _.shuffle lodash (в), чтобы смешать их и отображать их в порядке.

https://lodash.com/docs

Я люблю использовать lodash для операций по сбору и массива.

Смежные вопросы