Это абсолютно нормальное поведение, которое не показывает смещения или неправильности реализации MD5.
То, что вы делаете, - это (очень близко) брать 50 000 случайных чисел от 0 до 49 999. Когда вы делаете это, почти наверняка многие цифры будут повторяться, и поэтому некоторые цифры не появятся. На самом деле было бы очень маловероятно, что 50 000 номеров должны быть разными, без повторений.
Вы можете проверить это с помощью шестигранных кубиков - если вы бросите их 6 раз, вы вряд ли получите все шесть чисел и гораздо чаще увидите около 3, 4 или 5 из них с одним, два или три повторения. Это также связано с так называемым парадоксом дня рождения .
Другим примером этого явления является «вопрос стикера Панини». Альбом с наклейками Panini - это книга, вмещающая около 600 футбольных наклеек, посвященных Чемпионату мира по футболу. Каждый из них пронумерован и различен, и они произвольно представлены в пакетах. Вы должны получить один из каждого номера, чтобы завершить альбом. Предположим, что вы купили абсолютно правильное количество стикеров, чтобы заполнить альбом. Было бы очень повезло, если бы вы смогли идеально заполнить альбом, не имея двойников или недостающих наклеек. Фактически вам нужно купить в среднем большое количество наклеек, чтобы получить хотя бы одну из них (если вы не обмениваетесь копиями с другими коллекционерами).
Число различных значений 0-49,999, которые появляются, и число, показывающее «комкование», можно рассчитать математически. Я не уверен, как именно вы измеряете комкование. Но значение 38K заполненных значений будет достаточно стабильным от одного испытания к другому, даже если фактические значения, которые вы видите, изменятся.
Фактически, ожидаемое количество заполненных значений равно (1 - 1 / e) n, где n - количество возможных значений, а e - математическая константа 2.718281828 ... Ответ для n = 50000 - 31606. Конечно, вы не всегда получите это значение, но все результаты должны быть в пределах нескольких сотен или около того (плеваться здесь). Вы допустили небольшую ошибку в своей программе, поэтому я не смог расшифровать соответствующий расчет, который дает вам ~ 37000.