Why can’t a custom postype be registered with “admin_init” hook?

The admin_init hook is not fired when viewing pages in the frontend. So hooking register_post_type() to that action will lead to your custom post type (and with that all of its posts) not being available in the frontend at all.

As of Rarst’s answer to another question, the admin_init hook gets fired shortly after the init hook, which makes it seem possible to use (with a low value for priority) to register a custom post type for backend only. But the Plugin Handbook says it should be done before.

My suggestion is to use the init hook as generally recommended and only register the post type conditionally when is_admin() is true.

function wpse_254184() {
    if ( is_admin() ) {
        $args = array(
            'labels' => $labels,
            'public' => true,
        );
        register_post_type('random', $args);
    }
}
add_action( 'init', 'wpse_254184' );