Вопрос о JavaScript Math.random() и базовой логике

Я написал простой фрагмент кода для сравнения случайных различий в массивах и нашел что-то... что я не совсем понимаю.

  1. Я генерирую 2 массива, заполненных случайными числами
  2. Сложите различия между случайными числами
  3. Распечатайте среднюю разницу

Я ожидал бы, что результатом будет случайное число, близкое к 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.

Средняя разница между двумя числами - это средний размер детали.

(изначально комментарий)