Ответы пользователя по тегу JavaScript
  • Функция Math.floor?

    @tomatho
    Предполагаю что язык JavaScript, хоть в тегах это не указано.
    Рассмотрим пример вызова getRandomInt(5, 10)
    Math.random() - случайное число [0, 1)
    И важно именно что 1 не включительно!
    (max - min + 1) - я бы назвал количеством вариантов = 6.

    Почему 6? Что значит это 6? Попробуем посчитать 6 чисел начиная с нуля, получим:
    0, 1, 2, 3, 4, 5
    Теперь для себя нужно подчеркнуть что это получилось [0, 5] включительно.
    То есть, в отрезке [0, 5] ровно 6 целых чисел.
    Это распространённое заблуждение новичков, что в таком отрезке 5 чисел.

    Теперь смотрим дальше. Вспоминаем что Math.random() возвращает [0, 1).
    Умножим как написано в формуле на 6, получим:
    [0, 6)
    Подчеркнём снова, что 6 не включительно. Запишем 6 как пять и девять в периоде:
    [0, 5.(9) )
    Мысленно разделим отрезок на диапазоны где Math.floor() (округление вниз) даёт одинаковые результаты:
    [0, 0.(9) ), [1, 1.(9) ), [2, 2.(9) ), [3, 3.(9) ), [4, 4.(9) ), [5, 5.(9) ).

    Вспомним, что Math.random() возвращает число в отрезке [0, 1) равновероятно,
    а это означает, что число в диапазоне [0, 0.(9) ) будет выбрано с той же вероятностью,
    что и в диапазоне [1, 1.(9) ) в силу "равности" длины отрезков.
    Math.floor() будет отображать числа из этих отрезков на числа:
    0, 1, 2, 3, 4, 5
    И в силу "равности" длины отрезков, эти числа получатся тоже равновероятно.

    Наконец осталось прибавить min как в формуле, получим
    0+5, 1+5, 2+5, 3+5, 4+5, 5+5
    Или
    5, 6, 7, 8, 9, 10

    Теперь надеюсь ясна вся подноготная.
    И следовательно ясно, что эта функция возвращает равновероятно целое число в отрезке [min, max].

    Один важный комментарий: так будет до тех пор, пока min, max - целые числа.
    Если это не так, тем не менее не составляет труда понять поведение функция проделав те же ходы выше.
    Ответ написан
    Комментировать
  • Задача линейного программирования. Как добавить ограничение в модель?

    @tomatho
    Надо у либы просто из примера выписать получающиеся ограничения, чтобы понять.
    А ограничения там такие:
    brit * brit.plane    + yank * yank.plane  <= constraints.plane
    brit * brit.person   + yank * yank.person <= constraints.person
    brit * brit.cost     + yank * yank.cost   <= constraints.cost
    brit * brit.capacity + yank * yank.capacity -> максимизировать

    Затем смотрим на вашу систему:
    x1 * x1.r1 + x2 * x2.r1 + ... + xn * xn.r1 = constraints.r1
    x1 * x1.r2 + x2 * x2.r2 + ... + xn * xn.r2 = constraints.r2
    ...
    x1 * x1.rn + x2 * x2.rn + ... + xn * xn.rn = constraints.rn
    // и наконец!
    x1 * x1.one + x2 * x2.one + ... + xn * xn.one <= 1
    x1 * x1.one + x2 * x2.one + ... + xn * xn.one -> максимизировать

    Вот и всё, надо написать для вас итоговый конфиг или сами уже поняли?
    Ответ написан
    Комментировать
  • Как лучше решить задачу на поиск ближайшего числа?

    @tomatho
    Для третьего и четвёртого варианта невозможно из компаратора узнать был ли уже на таком же расстоянии.
    Выход который я вижу: "сместить" в пользу "низа", но это возможно только с определённой точностью.
    Второй вариант: можно сделать если передавать в компаратор три значения: текущее, лучшее сейчас, и то что ищем.

    Далее код для a, b - текущее, то что ищем соответственно.
    Код не проверял.
    function c1(a, b) {
      return (a <= b ? b - a : Number.MAX_VALUE );
    }
    function c2(a, b) {
      return (a >= b ? a - b : Number.MAX_VALUE );
    }
    function c3(a, b) {
      if (a <= b && b - a < Math.abs(b)*(1e-7))
        return 0;
      return Math.abs(a - b + Math.abs(b)*(1e-7));
    }
    function c4(a, b) {
      if (a >= b && a - b < Math.abs(b)*(1e-7))
        return 0;
      return Math.abs(a - b - Math.abs(b)*(1e-7));
    }
    Ответ написан
  • Как перебрать массив?

    @tomatho
    Рекомендую делать это днём.
    Открываешь шторы окна, чтобы было посветлее.
    Можешь дополнительно включить свет.
    Берёшь, высыпаешь весь массив на стол.
    Пальцами одни элементы отодвигаешь от других.
    Смотришь, чтоб элементы были хорошие.
    Ну и хорошие прямо со стола пальцем кидаешь в кастрюлю.

    А если серьёзно, то сначала сформулируйте понятнее.
    Ответ написан
    Комментировать