Уже 6 лет у меня на сайте есть страница с генератором случайных чисел . Долгое время это был первый или второй результат в Google для "генератора случайных чисел", и он использовался для принятия решений в десятках, если не сотнях конкурсов и рисунков на дискуссионных форумах и блогах (я знаю, потому что вижу рефереров в своих веб-журналы и обычно идут смотреть).
Сегодня кто-то написал мне, что это может быть не так случайно, как я думал. Она попыталась сгенерировать очень большие случайные числа (например, от 1 до 10000000000000000000) и обнаружила, что они почти всегда имеют одинаковое количество цифр. На самом деле, я заключил функцию в цикл, чтобы я мог генерировать тысячи чисел, и, конечно же, для очень больших чисел вариация составляла всего около 2 порядков.
Зачем?
Вот версия с циклом, поэтому вы можете попробовать ее сами:
http://andrew.hedges.name/experiments/random/randomness.html
Он включает в себя как простую реализацию, взятую из сети разработчиков Mozilla, так и некоторый код 1997 года, который я удалил с веб-страницы, которая больше не существует ("Central Randomizer 1.3" Пола Хоула). Просмотрите исходный код, чтобы узнать, как работает каждый метод.
Я читал здесь и в других местах о Mersenne Twister. Меня интересует, почему не было бы большего разброса в результатах встроенной функции JavaScript Math.random . Спасибо!
источник
Ответы:
Даны числа от 1 до 100.
Даны числа от 1 до 1000.
и так далее.
Таким образом, если вы выберете несколько случайных чисел, то подавляющее большинство выбранных чисел будет иметь одинаковое количество цифр, поскольку подавляющее большинство возможных значений имеют одинаковое количество цифр.
источник
Ваши результаты действительно ожидаются. Если случайные числа равномерно распределены в диапазоне от 1 до 10 ^ n, то можно ожидать, что примерно 9/10 чисел будут иметь n цифр, а еще 9/100 будут иметь n-1 цифры.
источник
Есть разные виды случайности. Math.random дает равномерное распределение чисел.
Если вам нужны разные порядки величин, я бы предложил использовать экспоненциальную функцию для создания так называемого степенного распределения :
Эта функция должна дать вам примерно такое же количество однозначных чисел, как двузначные числа и как трехзначные числа.
Существуют также другие распределения для случайных чисел, такие как нормальное распределение (также называемое распределением Гаусса).
источник
minimum = 1
иmaximum = 10
и иногда получаю 11 в результате. Вы, вероятно, хотели использоватьMath.floor
вместоMath.round
Для меня это выглядит совершенно случайно! (Подсказка: это зависит от браузера.)
Лично я думаю, что моя реализация была бы лучше, хотя я украл ее у XKCD , которого ВСЕГДА следует признать:
источник
В следующем документе объясняется, насколько math.random () в основных веб-браузерах является (небезопасным): «Временное отслеживание пользователей в основных браузерах и междоменная утечка информации и атаки» Амида Кляйна (2008) . Он не сильнее типичных встроенных функций ГПСЧ в Java или Windows.
С другой стороны, реализация SFMT периода 2 ^ 19937-1 требует 2496 байтов внутреннего состояния, поддерживаемого для каждой последовательности PRNG. Некоторым это может показаться непростительной ценой.
источник
Если вы используете число вроде 10000000000000000000, вы выходите за пределы точности типа данных, который использует Javascript. Обратите внимание, что все генерируемые числа заканчиваются на «00».
источник
Я попробовал генератор псевдослучайных чисел JS в Chaos Game .
Мой треугольник Серпинского говорит, что он довольно случайный:
источник
Что ж, если вы генерируете числа, скажем, до 1e6, вы, надеюсь, получите все числа примерно с равной вероятностью. Это также означает, что у вас есть только один шанс из десяти получить число с одной цифрой меньше. Один из ста шанс получить на две цифры меньше и т. Д. Я сомневаюсь, что вы заметите большую разницу при использовании другого ГСЧ, потому что у вас есть равномерное распределение по числам, а не их логарифм.
источник
Неслучайные числа, равномерно распределенные от 1 до N, обладают тем же свойством. Обратите внимание, что (в некотором смысле) это вопрос точности. При равномерном распределении чисел от 0 до 99 (в виде целых чисел) 90% номеров имеют две цифры. В равномерном распределении на 0-999999 905 пятизначных номеров.
Любой набор чисел (при некоторых не слишком ограничительных условиях) имеет плотность. Когда кто-то хочет обсудить «случайные» числа, следует указать плотность этих чисел (как отмечалось выше). Обычная плотность - это однородная плотность. Есть и другие: экспоненциальная плотность, нормальная плотность и т. Д. Прежде чем предлагать генератор случайных чисел, нужно выбрать, какая плотность важна. Кроме того, числа, поступающие из одной плотности, часто могут быть легко преобразованы в другую плотность кариозными способами.
источник