The explanation is in the comments:
<?php
...
if ( $query->have_posts() ) :
//number of small ones needed = a third of total number of posts
$numsmallneeded = round($query->post_count / 3);
...
while ( $query->have_posts() ) : $query->the_post();
//if no more small sizes are needed, use big
if ( !$numsmallneeded ) $size = 1;
//if number of small sizes needed = number of remaining posts, use small
else if ( $numsmallneeded == $query->post_count - $query->current_post) $size = 0;
//else pick at random
else $size = rand(0, 1);
//if small was picked, reduce number of small ones needed by 1
if ( !$size ) $numsmallneeded--;
?>
<li class="grid-item size-<?php echo ++$size; /*add 1 before printing*/ ?>">
...
<?php endwhile; wp_reset_postdata(); ?><!-- reset loop -->
</ul>
<?php endif;?>