Подтвердить что ты не робот

Верно или лучше Случайные числа с Javascript

У меня есть все виды ресурсов, которые полагаются на случайные числа javascript. Тем не менее, у меня было много проблем, когда случайность не была настолько случайной из-за того, что я генерирую случайные числа.

Есть ли какой-либо ресурс javascript для генерации истинных или просто лучших случайных чисел?

Я знаю, что я могу взаимодействовать с Random.org, но какие у меня есть другие варианты?

Я использую:

function rand( lowest, highest){
    var adjustedHigh = (highest - lowest) + 1;       
    return Math.floor(Math.random()*adjustedHigh) + parseFloat(lowest);
}
4b9b3361

Ответ 1

Предполагая, что вы не просто видите шаблоны там, где их нет, попробуйте Mersenee Twister (Статья в Википедии здесь). Существуют различные реализации, такие как этот в github.

Аналогичный вопрос SO:

Генератор случайных чисел с возможностью генерации

Если вам нужно что-то поближе к действительно случайному, подумайте об использовании random.org API, чтобы получить действительно случайные числа, хотя я бы предложил только используя это для семени, а не для каждого числа, поскольку вам нужно соблюдать их пределы использования.

Ответ 2

Тонкие числа, чтобы они выглядели случайными

Я согласен с Филом Х, что люди настолько хороши в поиске шаблонов, что часто считают, что они видят шаблоны даже в "совершенно случайных" последовательностях чисел (кластеризация иллюзия, апофения, ошибка игрока и т.д.).

Графики истинных случайных позиций обычно имеют много комков и точек, которые "по совпадению" падают очень близко друг к другу, что выглядит довольно подозрительно.

Художники часто берут полностью произвольно сгенерированные шаблоны и "подталкивают" их, чтобы они казались "более случайными", хотя это тщательное подталкивание фактически делает шаблон менее случайным (a), (b), ( c), (d) и т.д.

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

Генераторы быстрых случайных чисел

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

Генераторы случайных чисел без криптографической силы, которые по-прежнему дают отличную производительность (маловероятно, что люди, не имеющие аналогов, когда-либо видели какие-либо образцы) включают Mersenne twister, multiply-with-carry, Отложенный генератор Фибоначчи, Хорошо равнораспределенная длиннопериодная линейная, Xorshift, и т.д.

Методы криптографического случайного числа, которые работают с некоторыми браузерами

Я слышал, что Cryptocat, а в других приложениях JavaScript используются удобные функции window.crypto.getRandomValues() или window.msCrypto.getRandomValues() или SubtleCrypto.generateKey(), которые предназначенных для генерации криптографических случайных чисел. К сожалению, эта функция недоступна в IE 11 и ниже.

Так как веб-браузеры все время используют случайные числа (для каждой страницы "https://" они выбирают), вполне вероятно, что эти функции (где доступно) могут работать быстрее, чем большинство генераторов случайных чисел, написанных на JavaScript, - даже некриптографические алгоритмы.

Методы криптографического случайного числа, совместимые с древними и современными браузерами

Один из способов генерации истинных случайных чисел в JavaScript - это захват событий мыши и их добавление в пул энтропии, отслеживающий некоторую (надеюсь, консервативную) оценку добавленной энтропии. Когда пул "заполнен" (оценки показывают, что добавлено не менее 128 бит энтропии), используйте криптографически безопасный генератор случайных чисел для генерации случайных чисел из пула - как правило, используя односторонний хэш, так что последовательность из нескольких тысяч выходных чисел недостаточно, чтобы вывести состояние энтропийного пула и, следовательно, предсказать следующий номер выхода.

Одна реализация: http://lightsecond.com/passphrase.html

Дальнейшее чтение

Ответ 3

вы можете создать пул случайных чисел, просто запросив некоторые данные асинхронно, потому что performance.now() дает вам временную точность до микросекунд. Затем используйте время отклика в качестве соли в алгоритме рандомизации,

var randomNumbers = [];
for(var i = 0; i < 10; i++) {
  setTimeout(function () {
    var timeStart = performance.now();
    xhttp = new XMLHttpRequest();
    xhttp.open('GET', 'https://cdn.polyfill.io/v2/polyfill.min.js?rand=' + Math.random(), true);
    xhttp.onload = function () {
      var timeEnd = performance.now() - timeStart;
      var rNumber = parseInt(timeEnd.toString().replace('.', ''));
      randomNumbers.push(rNumber)
    };
    xhttp.send();
  }, i * 10);
}

На это время будет влиять множество факторов:

  • скорость браузера
  • маршрут в одну сторону.
  • время ответа сервера
  • маршрут назад

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

Ответ 4

Я создал библиотеку JavaScript, которая использует функции cosine и sine для генерации случайных чисел с использованием Date.now() и новой Date(). getTime(). Для каждого случайного числа я проверяю, было ли оно использовано. Если это так, я повторяю этот процесс, пока не получу новый номер. Если я получу новый номер, я добавлю номер в использованный список и верну его. В той же библиотеке я также добавил анализатор случайности, который проходит через генератор случайных чисел и ищет шаблоны. Это хорошо, потому что он быстро загружает числа (я приурочил его к console.time) без лишнего обращения к другим страницам.

Вы можете найти библиотеку здесь: punbb.atspace.cc/scripts/libraries/random.js