Just No more free questions left!

Upgrade Now
**
Write a function for doing an in-place shuffle of a list.
**

The shuffle must be "uniform," meaning each item in the original list must have the same probability of ending up in each spot in the final list.

Assume that you have a function get_random(floor, ceiling) for getting a random integer that is >= floor and <= ceiling.

A common first idea is to walk through the list and swap each element with a random other element. Like so:

import random
def get_random(floor, ceiling):
return random.randrange(floor, ceiling + 1)
def naive_shuffle(the_list):
# for each index in the list
for first_index in xrange(0, len(the_list) - 1):
# grab a random other index
second_index = get_random(0, len(the_list) - 1)
# and swap the values
if second_index != first_index:
the_list[first_index], the_list[second_index] = \
the_list[second_index], the_list[first_index]

**However, this does not give a uniform random distribution.**

Why? We could calculate the exact probabilities of two outcomes to show they aren't the same. But the math gets a little messy. Instead, think of it this way:

Suppose our list had 3 elements: [a,b,c]. This means it'll make 3 calls to get_random(0, 2). That's 3 random choices, each with 3 possibilities. So our total number of possible *sets of choices* is 3*3*3=27. Each of these 27 sets of choices is equally probable.

But how many possible *outcomes* do we have? If you paid attention in stats class you might know the answer is 3!, which is 6. Or you can just list them by hand and count:

a,b,c
a,c,b
b,a,c
b,c,a
c,b,a
c,a,b

But our function has 27 equally-probable sets of choices. 27 is not evenly divisible by 6. So some of our 6 possible *outcomes* will be achievable with more *sets of choices* than others.

We can do this in a single pass. time and space.

A common mistake is to have a mostly-uniform shuffle where an item is less likely to stay where it started than it is to end up in any given slot. Each item should have the same probability of ending up in each spot, including the spot where it starts.

We'll never post on your wall or message your friends.

Once you're logged in, you'll get free full access to this and 4 other questions.

We'll never post on your wall or message your friends.

Once you're logged in, you'll get free full access to this and 4 other questions.

time and space.

We'll never post on your wall or message your friends.

Once you're logged in, you'll get free full access to this and 4 other questions.

Powered by qualified.io

{"id":7165606,"username":"2018-01-17_10:31:36_x3rn1%","email":null,"date_joined":"2018-01-17T10:31:36.823187+00:00","first_name":"","last_name":"","full_name":"","short_name":"friend","is_anonymous":true,"is_on_last_question":false,"percent_done":0,"num_questions_done":0,"num_questions_remaining":46,"recruiting_is_interested_in_intros":null,"is_full_access":false,"first_payment_date":null,"last_payment_date":null,"num_free_questions_left":3,"terms_has_agreed_to_latest":false,"preferred_content_language":"","preferred_editor_language":"","is_staff":false,"auth_providers_human_readable_list":"","num_auth_providers":0,"auth_email":"","profile_public_id":null}

. . .