2014-11-26 2 views
1

Я создаю гибридное приложение в Javascript, которое случайно выбирает упражнение из базы данных, дожидаясь, когда пользователь его разрешит, а затем выберите другое упражнение.Выбирайте всегда другое число в диапазоне 3K номеров

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

Теперь мой код 'работает' таким образом:

  1. Возвращает общее количество упражнений (около 3K),
  2. Генерировать N случайное число от 1 до 3000,
  3. выбрать N упражнения из БД,
  4. Сохранить N номер в «использовать» таблицы БД,
  5. Сформировать другое имя номер,
  6. На этот раз в первую очередь проверьте, если сгенерированный номер уже был использован,
  7. Если НЕТ выбор упражнений, если ДА создать другой номер,
  8. и т.д ...

Код хорошо работает для первые 2000-2500 номеров, а затем начинают очень медленно, потому что создание случайного числа, которое еще не используется, начинает очень сложно. Когда используемое число всего лишь немного меньше 3K, код полностью сломан: продолжает проверяться, но новый номер никогда не приходит

Как я могу справиться с этой ситуацией быстрым и легким способом, который использует память как можно меньше?

Большое спасибо!

EDIT

Я использую WebSQL в приложении PhoneGap

Вот что я делаю (код):

Здесь я получаю количество упражнений

1. SELECT COUNT(*) AS countArt FROM Exercises' 

Здесь я выбираю случайное число от 1 до totalNumberOfExercises

2. randomNumber = random(totalNumberOfExercises); 
    function numeroCasuale(len){ 
     var num = Math.floor(Math.random() * len) + 0; 
     return num; 
    }; 

Здесь я проверить, если мой randomNumber уже в БД, это означает, что уже используется

4. SELECT EXISTS(SELECT * FROM alreadyUsed WHERE numero=randomNumber) 

Если randomNumber существует я создать еще randomNumber и проверить его снова и снова ...

+1

Его лучше создать массив из всех возможных 3000 номеров, а затем удалить уже использованные, а затем получить случайное число из оставшихся неиспользуемых номеров. – juvian

+1

Поместить числа от 1 до 3000 в массив, а затем перетасовать массив , Затем вы можете просто выбирать числа, увеличивая индекс в массиве, и вам гарантировано не получить дубликат. – Pointy

+0

Как вы генерируете это случайное число (SQL или приложение)? Какую базу данных вы используете? Можете ли вы опубликовать код? –

ответ

2

Используя эту функцию воспроизведения в случайном порядке из другого stackoverflow question:

function shuffle(o){ 
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
} 

Вы можете создать это:

function generateRandomSequence(amount){ 
    var random = []; 
    for (var i = 0; i<amount; i++) random[i] = i; 
    return shuffle(random); 
} 

var random = generateRandomSequence(3000); 
var gamesCompleted = 0; 

function nextGame(){ 
    console.log(random[gamesCompleted]); 
    gamesCompleted++; 
} 

nextGame(); 

Это создает массив, в котором положение 0 = 0, 1 = 1 и т. Д., И перемешайте его, чтобы мы имели случайную последовательность без дубликатов.Следите за тем, сколько игр вы закончили, и используйте этот номер в качестве индекса для следующего вопроса. Here's a fiddle.

+0

Я думаю, что ваш ответ хорош, но моя проблема в том, что мне нужно постоянно хранить массив случайных чисел, потому что код должен работать внутри приложения peonegap, и я хочу, чтобы выбранное упражнение было уникальным, даже если пользователь закрыл приложение. – elledienne

+0

Ага. В этом случае сохраните его в локальном хранилище. Быстрый пример, когда приложение запускает проверку, если 'localStorage.getItem ('randomSequence') == null', если true, сгенерируйте последовательность и сохраните ее в localStorage, если false, получите элемент оттуда. Вам нужно будет использовать 'JSON.stringify()' и 'JSON.parse()' для хранения его как строки в localStorage. Не забудьте сохранить и загрузить игры. Имеет ли это смысл? Я могу написать пример, если вы пожелаете, и добавить его в ответ. – ostrgard

+0

Спасибо вам большое! Я знаю localStorage, у меня только вопрос: не localStorage читать/писать довольно «медленно»? – elledienne

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