Что в номере твоём?
Интересно, а кто-то пытался статистически анализировать номера, которые живой журнал назначает новым записям. Неважно. Это попробую сделать я :)
В моём журнале всего 60 с лишним постов, ссылка на предпоследний из них выглядит следующим образом – http://iodiot.livejournal.com/18857.html. Соответственно, уникальный номер этой записи – 18857. Наверное, вы уже замечали, что цифры достаточно большие. Скорее всего, это было сделано умышленно для психологического комфорта блоггеров, useability так сказать.
Номера постов монотонно возрастают, но идут не подряд, т.е. значения соседних записей отличаются не на единицу. Это логично. Потому что в противном случае, к примеру, я захожу на незнакомый журнал и вижу два последних поста с номерами 98 и 100, и почти определённо могу сказать, что между ними (т.е. в данном отрезке времени) существует или скрытая запись, или была старая, которую безвозвратно удалили. Privacy мать его.
Ближе к телу. Возьмём номера моих последних 50 записей, вот они:
4795 4956 5194 5687 6132 6610 6717
7074 7479 7699 8181 8446 8630 8951
9034 9222 9617 9775 10237 10435 10547
10863 11121 11399 11762 11814 12084 12337
12761 13156 13378 13593 13988 14271 14433
14672 15016 15277 15360 15831 15893 16230
16581 16894 16998 17270 17974 18384 18540
18857
Что делать с этими цифрами я не знаю. Поэтому возьмём разности между соседними номерами, теперь их всего 49:
161 238 493 445 478 107 357 405 220 482 265 184 321 83 188
395 158 462 198 112 316 258 278 363 52 270 253 424 395 222
215 395 283 162 239 344 261 83 471 62 337 351 313 104 272
704 410 156 317
Вот это уже интереснее. Начнём с простого: подсчитаем максимум, минимум, мат. ожидание, дисперсию и построим гистограмму распределения значений:
max = 704
min = 52
mx = 286.9796
sx = 136.0748
dx = 1.8516e+004
Что-то max уж слишком большой вышел, скажу вам по секрету: записи я удалял. К слову, min также странен. Интересно ещё, почему такое больше mx, т.е. мат. ожидание, может в идеале это была восьмая степень двойки.
А теперь построим гистограмму, которая просто-напросто отображает, сколько элементов из выборки попали в тот или иной интервал. Зачем? Проверим одно предположение, что движок ЖЖ генерирует номера новых записей следующим образом: берётся номер последней записи на данный момент, и с помощью генератора случайных чисел к нему прибавляется другое число, равное rand(). А гипотеза в том, что генератор, т.е. сама функция rand(), подчиняется нормальному закону распределения (или распределению Гаусса). Гистограмма, конечно же, ничего не доказывает, но визуализирует уж точно:

Неоднозначный результат. Тогда натравим поочерёдно критерии Колмогорова и Пирсона для проверки нашей гипотезы. Напомню, что проверяем нормальность распределения. Критерий Колмогорова ищет максимальную разность между экспериментальным и теоретическим распределениями, и в данном случае разность равна 1 и Matlab говорит, что дело гиблое. Пирсон с ним солидарен, вот output кому интересно:
test = 0
stats =
chi2stat: 2.4727
df: 3
edges: [1x7 double]
O: [14 5 7 4 5 15]
E: [12.0782 6.0285 6.8087 6.8187 6.0550 12.2108]
Резюмируя. Номера записей движок живого журнала генерирует с умом: privacy и useability тесты пройдены. Но гипотеза, что ЖЖ использует генератор случайных чисел, подчиняющийся нормальному закону – не подтвердилась. Правда всё дело может быть в том, что выборка слабоватая и не представительная, и, что исторически удалённые записи внесли свою дисперсию…
[update] Совместными усилиями с amikhailov мы нашли алгоритм генерации номеров новых записей. Всё дело в том, что для этого используются порядковые номера постов в журнале, т.е. 1, 2, 3... В общем, вот формула:
post_number = (prev_post_order + 1) * 256 + rand(256);
Другими словами, берётся порядковый номер предыдущей записи, к нему прибавляется единица, всё это умножается на 256, а потом к полученному числу прибавляется случайное число из диапазона 0..255. К примеру, номера первой и второй записей будут 1*256 + rand(256) и 2*256 + rand(256) соответственно.