Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2014, 20:47
Новичок на форуме
Отправить личное сообщение для alexchipliev Посмотреть профиль Найти все сообщения от alexchipliev
 
Регистрация: 29.01.2014
Сообщений: 1

Нужна помощь в реализации алгоритма
Нужно создать приложение (браузерное, или десктопное, c использованием Node.js - некритично), для генерации комбинаций 6 пар чисел, от 1 до 36, за вычетом исключений (заранее введенных, и сохраненных в базе), с выводом всех теоретически возможных вариантов, и так же с сохранением их в базе, для последующего выбора одного, или нескольких их них рандомным способом. Какую реализацию алгоритма вы бы посоветовали? Вариант на javascript с веб интерфейсом, не подвесит ли браузер во время вычислений?
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2014, 21:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

alexchipliev,
какая мелочь база на
alert(36*35*34*33*32*31)

вариантов
Ответить с цитированием
  #3 (permalink)  
Старый 02.02.2014, 01:33
Интересующийся
Отправить личное сообщение для Nodeveloper Посмотреть профиль Найти все сообщения от Nodeveloper
 
Регистрация: 01.02.2014
Сообщений: 11

В базе достаточно хранить список игнорируемых исключений, и пользоваться функцией getRandomRangeWithoutIgnored с передачей ей параметра ignored, который имеет следующий формат:
ignored = {};
ignored[ generate() ] = 1;

Т.е. ключ — это результат функции generate, а значение может быть любым, кроме false, null, undefined, 0, и прочих типов, которые приводятся к false.
Первый аргумент функции getRandomRangeWithoutIgnored — это количество элементов в результирующем массиве (т.е. количество шестерок пар чисел от 1 до 36), которое гарантированно вернет функция.

Если количество элементов настолько велико, что встает ограничение по памяти на вашем сервере, то можно использовать фильр блума для определения, входит ли генерируемая шестерка пар в список игнорируемых.

Также, в текущей реализации используется не очень хороший генератор случайных чисел. В реальной обстановке следует использовать честный генератор случайных чисел.

function pair (offset) {
  var a = Math.floor(offset / 36) % 36,
       b  = Math.floor(offset % 36);
  return [a+1,b+1];
}

function generate (seed) {
  var seed = typeof seed === 'number' && seed >= 0 ? seed : 0,
        pairs = [];

  while (pairs.length < 6) {
    pairs[pairs.length] = pair(seed++);
  }

  return pairs;

}

function getRange (seed, count) {
  var seed = typeof seed === 'number' && seed >= 0 ? seed : 0,
       count = typeof count === 'number' && count > 0 ? count : 1,
       ret = [];
  while (count--) {
   var generated = generate(seed);
   ret[ret.length] = generated;
   seed += generated.length;
  }
  return ret;
}

function getRangeRandom (count) {
  var count = typeof count === 'number' && count > 0 ? count : 1,
       ret = [],
       seed;
  while (count--) {
    seed = Math.round(Math.random()*36*35*34*33*32*31); // thk @рони
    ret[ret.length] = generate(seed);
  }
  return ret;
}

function getRandomRangeWithoutIgnored (count, ignored) {
  var count = typeof count === 'number' && count > 0 ? count : 1,
       ignored = typeof ignored === 'object' && Object.prototype.toString.call(ignored) !== '[object Array]' ? ignored : null,
       ret = [];
  if (ignored == null) {
    return getRangeRandom (count);
  }
  while (ret.length < count) {
    var range = getRangeRandom (count);
    for (var i=0, l=range.length; i<l; i++) {
        if (!ignored[range[i]]) {
           ret[ret.length] = range[i];
        }
    }
  }
  return ret;
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь по javascript darklend Общие вопросы Javascript 0 12.01.2014 23:33
Datagrid нужна помощь в реализации arahmanov Flash 2 08.04.2013 17:12
Flash datagrid нужна помощь в реализации таблицы arahmanov Работа 1 07.04.2013 13:20
Нужна помощь для реализации функции d'n'd vaal Элементы интерфейса 4 09.06.2010 17:27
нужна помощь dominosoko Серверные языки и технологии 4 14.03.2010 02:17