How would you code a shuffle() function that randomizes an array uniformly using roll()?
Question Analysis
The question asks you to implement a shuffle()
function that randomizes an array uniformly. The key requirement is to use a roll()
function to achieve this. The roll()
function can be assumed to generate a random number in a specific range, similar to rolling a die where the range is defined. Understanding this, it is important to ensure that the shuffle algorithm is unbiased, meaning every permutation of the array is equally likely. A well-known algorithm for this purpose is the Fisher-Yates shuffle (also known as the Knuth shuffle), which is effective in generating a uniform distribution of the array elements.
Answer
To implement the shuffle()
function using the roll()
function, we can use the Fisher-Yates shuffle algorithm. Below is a step-by-step guide and implementation:
- Initialize: Start from the end of the array and iterate backward.
- Generate Random Index: For each position
i
in the array, useroll()
to generate a random indexj
such that0 <= j <= i
. - Swap Elements: Swap the elements at indices
i
andj
. - Repeat: Continue the process until the beginning of the array is reached.
Here's how you can implement this:
import random
def roll(max_value):
# Simulates a dice roll that returns a number between 0 and max_value
return random.randint(0, max_value)
def shuffle(array):
n = len(array)
for i in range(n-1, 0, -1):
j = roll(i) # Get a random index such that 0 <= j <= i
array[i], array[j] = array[j], array[i] # Swap elements
return array
Key Points:
- Uniform Distribution: The Fisher-Yates algorithm ensures that each permutation of the array is equally likely, achieving uniform randomness.
- Efficiency: The algorithm runs in O(n) time complexity, making it efficient for shuffling large arrays.
- Randomness Source: The
roll()
function is crucial as it provides the randomness needed to determine which elements to swap.
By following these steps, you can successfully implement a shuffle function that randomizes an array uniformly, meeting the requirements of the question.