Вопрос о JavaScript Math.random() и базовой логике
Я написал простой фрагмент кода для сравнения случайных различий в массивах и нашел что-то... что я не совсем понимаю.
- Я генерирую 2 массива, заполненных случайными числами
- Сложите различия между случайными числами
- Распечатайте среднюю разницу
Я ожидал бы, что результатом будет случайное число, близкое к 0,5, но на практике это 0,3333.
Почему массив случайных чисел находится на 0,3, а не на 0,5?
const result = document.getElementById('result');
const generateRandomNrArray = (nrNumbers) => {
let i;
let result = [];
for (i = 0; i < nrNumbers; i++) {
result.push(Math.random());
}
return result;
}
const getArrayDiff = (arr1, arr2) => {
var diff = 0;
arr1.forEach(function (v1, index) {
diff += Math.abs(v1 - arr2[index]);
});
return diff;
}
const run = (nr) => {
const arr1 = generateRandomNrArray(nr);
const arr2 = generateRandomNrArray(nr);
const totalDiff = getArrayDiff(arr1, arr2);
result.innerHTML = "Average difference:" + (totalDiff / nr);
}
button {font-size: 2em;}
<div id="result"></div>
<button id="run" onclick="run(1500)">Click Me</button>
Ответы
Ответ 1
Это в основном сводится к пределу, и это имеет смысл. Рассмотрим комбинации чисел от 0 до 10 и подсчитайте различные различия, которые вы можете сделать.
Например, есть одна комбинация с разницей 9 - (0, 9). Есть 5 с разницей 5:
[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]
Но есть девять комбинаций с разницей в 1:
[1, 2],
[2, 3],
...
[8, 9]
При 0 - 10 счетами являются:
{1: 9, 2: 8, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2, 9: 1}
Существует 45 комбинаций, и средняя разница между этими комбинациями составляет 3.6666
не 5
потому что различия меньше, чем у более крупных.
При увеличении гранулярности от 0–10 до 0–100 сохраняется та же схема. Есть 99 комбинаций, которые приводят к разнице 1 и только 50 с разницей 50 в среднем 33.6666
.
Когда вы увеличиваете число значащих цифр в противоположных направлениях в противоположном направлении с более мелкими и более тонкими делениями между 0 и 1, вы обнаруживаете тот же процесс, что и предел приближается к 1/3
. Разница намного меньше, чем крупнее, тянут среднюю разницу вниз. Для 0-1
с интервалами 0,1 вы увидите 9 с разницей 0,1 и 5 с разницей 0,5, при 0,01 будет 99 с разницей 0,01 и 50 с разницей 0,5. Когда интервал приближается к 0, среднее значение различий приближается к 1/3
.
Ответ 2
(На самом деле, вы смотрите не на различия, а на абсолютные различия между вашими случайными числами. Есть разница. (Простите за каламбур.))
Если у вас есть две независимые равномерно распределенные случайные величины X, Y ~ U[0,1]
, то их абсолютная разница |XY|
будет следовать треугольному распределению с ожиданием 1/3. Все как и должно быть. Этот результат распределения, так же как и вычисление ожидания, является довольно стандартной проблемой домашнего задания в теории вероятностей. Интуиция непосредственно следует за аргументом Марка.
Вот гистограммы абсолютных и не абсолютных различий. Слева вы видите, как больше массы для меньших абсолютных разностей, что снижает ожидания.
![triangles]()
Код R:
set.seed(1)
xx <- runif(1e5)
yy <- runif(1e5)
par(mfrow=c(1,2))
hist(abs(xx-yy),main="|X-Y|",col="grey",xlab="")
hist(xx-yy,main="X-Y",col="grey",xlab="")
(Кстати, наш родственный сайт CrossValidated - замечательный ресурс, если у вас есть вопрос о вероятности/статистике.)
Ответ 3
Здесь геометрический аргумент, чтобы продемонстрировать, почему результат сходится к 1/3.
Сначала определим f (x, y) = abs (x - y). Нам нужно доказать, что для X и Y, являющихся двумя независимыми случайными величинами с равномерным распределением в [0, 1], E (X, Y) = 1/3.
Если мы визуализируем функцию f в 3D как поле высоты над квадратом [0, 1] x [0, 1], то объем под f состоит из двух тетраэдров, основание которых - квадрат в половину единицы, а высота - блок высокий.
E (X, Y) - объем под f. По формуле объема пирамиды каждый из двух тетраэдров имеет объем a * h/3, где a - его базовая площадь, а h - его высота. Это означает, что каждый тетраэдр имеет объем 1/2 * 1 * 1/3 = 1/6, и, следовательно, E (X, Y) = 2 * 1/6 = 1/3.
Ответ 4
с подходом с дискретными переменными
разделить интервал [0; 1] на N элементов (соответственно от k = 1 до N, X
примет значение k/N
). Позже мы сделаем N склонны к младенчеству
Для данного X_k
(где X
содержит значение k/N
), вычислите среднее расстояние, заданное как
avgDistance(k) = sum_{i=1}^k (k-i)/N P(Y=i) + sum_{i=k+1}^n (i-k)/N P(Y=i)
первый член, когда у <х, второй член, когда х <у
Первый член суммирует расстояние между 0 и k, так что 1/N(k(k+1)/2)
, а второй член суммирует расстояние между 1 и Nk, так что 1/N(Nk)(N-k+1)
. Кроме того, P(Y=i) = 1/N
для всех я (так как Y
равномерно распределен)
таким образом
avgDistance(k) = 1/N^2 [ k(k+1)/2 + (N-k)(N-k+1)/2 ] = 1/(2N^2) [ 2k^2 + N^2 - 2kN + N ]
в заключение
avgDistance = sum_{k=1}^N avgDistance(k) P(X=k) = 1/N sum_{k=1}^N avgDistance(k) = 1/(2N^3) sum [ 2k^2 + N^2 - 2kN + N ]
Идея состоит в том, чтобы упростить сумму как aN ^ 3 +... слагаемые, меньшие чем N ^ 3, таким образом, когда N стремится к infty, мы просто получим aN ^ 3/(2N ^ 3) + что-то, что стремится к 0
sum 2k^2 = 2(N(N+1)(2N+1))/6 ~ 4N^3/6
sum N^2 = N^3
sum -2kN = -2N(N(N+1)/2 ~= -N^3
Таким образом, a = 4/6
и avgDistance = 1/3
Ответ 5
Существует простой естественный способ взглянуть на это:
Если у вас есть интервал, скажем, <0.0, 1.0>
и вы случайным образом выбираете число из интервала, вы по существу разделите интервал на две части <0.0, x>
и <x, 1.0>
. Средний размер каждой части (по множеству случайных чисел) будет сходиться до 0.5
.
Теперь, если вы выберете два случайных числа из интервала, вы разделите интервал на три части: <0.0, x>
, <x, y>
и <y, 1.0>
(x < y
). Если вы вычислите средний размер каждой части по множеству случайных чисел, она будет сходиться к 1/3
.
Средняя разница между двумя числами - это средний размер детали.
(изначально комментарий)