posts_per_page => 1 shows 2 posts

Most probably you have a sticky post there. If you want exact number of posts you need to ignore sticky posts. So your query should look like this:

query_posts( array(
    'orderby' => 'rand',
    'posts_per_page' => 1,
    'ignore_sticky_posts' => 1,
) );

or as suggested, never use query_posts()

$query = new WP_Query( array(
    'orderby' => 'rand',
    'posts_per_page' => 1,
    'ignore_sticky_posts' => 1,
) );