Comments 10
Монументально!
>So Penny's a little messy
>A little messy? The Mandelbrot set of complex numbers is a little messy. This is chaos.… This is a swirling vortex of entropy.

Пока читал статью — не покидало ощущение что там речь шла как раз о вихре Мерсенна. Ан нет, показалось.
Почему, если на графиках производительность, то меньше = лучше? Возможно, это всё-таки время выполнения?
О, вы догадались, что меньше = лучше? Я, например, вообще не догадался.
Я тоже половину статьи находился в лёгком когнитивном диссонансе :)
Спасибо!

Замечательная статья. Прочитал с удовольствием.
Вопрос, который меня интересует, состоит в следующем:

1. Если выполнить генерацию случайных, равномерно-распределенных целых чисел на некотором интервале [ n1, n2 ], то окажется, что часть чисел из этого интервала повторяется два или более раза, а некоторых чисел в этой сгенерированной выборке вообще нет. Это плохо, но это факт. Что можете сказать по результатам работы вашего алгоритма – доля повторов и отсутствующих чисел увеличивается или уменьшается в сравнении с другими алгоритмами?

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

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

Так и должно быть при генерации случайных чисел, чтобы не было известно каким будет следующее число. Это не плохо, просто не то что вам нужно.
Вам же нужна случайная перестановка. Например, заполните массив числами от n1 по n2 и перетасуйте алгоритмом Фишера — Йетса. На JavaScript примерный код:


function shuffle(array) {
  for (let i = 0; i < array.length; i += 1) {
    const j = Math.floor(Math.random() * (i + 1)); // rand int 0 =< j =< i
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

function getRandomPermutationRange(n1, n2) {
  const array = [];

  for (let i = n1; i <= n2; i += 1) {
    array.push(i);
  }

  return shuffle(array);
}

getRandomPermutationRange(1, 9) // выведет [ 8, 6, 9, 1, 4, 7, 2, 3, 5 ]

Тут строка Math.floor(Math.random() * (i + 1)) — простейший для JavaScript способ генерации числа в заданном интервале. Как раз то, о чём идёт речь в этой статье.

Мне кажется, что для больших t, этот код вычисляет не (t % range), a (t % range — 1):


        if (t >= range) {
            t -= range;
            if (t >= range) 
                t %= range;
        }

Но я плохо читаю C++ и могу ошибаться...

Разве t и (t - range) не равны по модулю range?
Оператор %= вычисляет остаток от деления (а не частное).

Оптимизация остатка от деления с дополнительной разностью — IMHO, весьма спорная оптимизация, она имеет смысл только для больших значений верхней границы. Если же верхняя граница невелика, то вам придется в среднем вычислять как остаток от деления, так и разность.

Only those users with full accounts are able to leave comments. Log in, please.