Random sampling distributions in NumPy - Time & Space Complexity
We want to understand how the time needed to create random samples changes as we ask for more samples.
How does the work grow when we increase the number of random values we generate?
Analyze the time complexity of the following code snippet.
import numpy as np
# Generate n random samples from a normal distribution
n = 1000
samples = np.random.normal(loc=0, scale=1, size=n)
# Calculate the mean of the samples
mean_value = np.mean(samples)
This code generates n random numbers from a normal distribution and then finds their average.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Generating
nrandom numbers and then calculating their mean. - How many times: The random number generation and mean calculation each process all
nelements once.
As we ask for more samples, the work grows roughly in direct proportion to the number of samples.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 random draws and 10 values averaged |
| 100 | About 100 random draws and 100 values averaged |
| 1000 | About 1000 random draws and 1000 values averaged |
Pattern observation: Doubling the number of samples roughly doubles the work done.
Time Complexity: O(n)
This means the time needed grows in a straight line with the number of samples you want.
[X] Wrong: "Generating random samples is instant and does not depend on how many samples I ask for."
[OK] Correct: Each sample requires some work, so more samples mean more time. The time grows directly with the number of samples.
Understanding how sampling time grows helps you explain performance when working with data simulations or bootstrapping in real projects.
"What if we generate samples in batches of fixed size instead of all at once? How would the time complexity change?"
Practice
numpy.random.choice function do in random sampling?Solution
Step 1: Understand the purpose of
This function is used to randomly pick elements from an input array or list, optionally with replacement.numpy.random.choiceStep 2: Compare with other options
Options A, B, and C describe different numpy functions or operations unrelated to random selection from an array.Final Answer:
It selects random elements from a given array or list. -> Option AQuick Check:
numpy.random.choice= random selection [OK]
- Confusing choice with normal distribution generator
- Thinking choice creates sequences
- Assuming choice calculates statistics
Solution
Step 1: Recall the numpy binomial function signature
The correct syntax isnumpy.random.binomial(n, p, size)wherenis number of trials,pis success probability, andsizeis number of samples.Step 2: Check each option
numpy.random.binomial(10, 0.3, size=5)matches the correct order and uses the keywordsize. numpy.binomial(10, 0.3, 5) misses.random. numpy.random.binomial(size=5, 10, 0.3) mixes keywordsize=5followed by positionals, causing SyntaxError. numpy.random.binomial(5, 10, 0.3) swaps parameters incorrectly.Final Answer:
numpy.random.binomial(10, 0.3, size=5) -> Option BQuick Check:
binomial(n, p, size) = numpy.random.binomial(10, 0.3, size=5) [OK]
- Mixing argument order
- Omitting size keyword
- Using wrong function name
import numpy as np np.random.seed(0) samples = np.random.normal(loc=5, scale=2, size=3) print(np.round(samples, 2))
Solution
Step 1: Understand the code
The code sets a random seed for reproducibility, then generates 3 samples from a normal distribution with mean 5 and standard deviation 2.Step 2: Run or recall the output
Using seed 0, the samples generated are [8.53, 5.8, 6.96] after rounding to 2 decimals.Final Answer:
[8.53 5.8 6.96] -> Option DQuick Check:
Seed 0 normal samples = [8.53 5.8 6.96] [OK]
- Ignoring seed causes different outputs
- Rounding incorrectly
- Mixing mean and scale parameters
import numpy as np samples = np.random.uniform(low=0, high=1, size=4) print(samples)
Solution
Step 1: Review the numpy uniform function syntax
np.random.uniform(low, high, size)is the correct way to generate samples from a uniform distribution.Step 2: Check the code correctness
The code uses correct function name, parameter order, and size as integer for 1D array. It will run without error and print 4 random values between 0 and 1.Final Answer:
There is no error; the code runs correctly. -> Option AQuick Check:
Uniform sampling syntax correct = There is no error; the code runs correctly. [OK]
- Confusing numpy.random.uniform with Python's random.uniform
- Swapping low and high values
- Using tuple for size unnecessarily
Solution
Step 1: Understand the problem
We want to simulate rolling a die 1000 times, each roll equally likely from 1 to 6, then count how many times 4 appears.Step 2: Evaluate each option
rolls = np.random.randint(1, 7, size=1000) count_4 = np.sum(rolls == 4):rolls = np.random.randint(1, 7, size=1000) count_4 = np.sum(rolls == 4)uses randint from 1 to 6 (exclusive upper bound 7), perfect for die rolls. rolls = np.random.binomial(6, 1/6, size=1000) count_4 = np.count_nonzero(rolls == 4):rolls = np.random.binomial(6, 1/6, size=1000) count_4 = np.count_nonzero(rolls == 4)uses binomial which models number of successes in trials, not die rolls. rolls = np.random.choice([1,2,3,4,5,6], size=1000) count_4 = np.sum(rolls == 4):rolls = np.random.choice([1,2,3,4,5,6], size=1000) count_4 = np.sum(rolls == 4)omits replace=True (defaults to False), raising ValueError since size=1000 > 6. rolls = np.random.normal(4, 1, size=1000) count_4 = np.sum(rolls == 4):rolls = np.random.normal(4, 1, size=1000) count_4 = np.sum(rolls == 4)uses normal distribution, inappropriate for discrete die rolls.Step 3: Choose the best correct code
rolls = np.random.randint(1, 7, size=1000) count_4 = np.sum(rolls == 4)is the correct way to simulate die rolls and count 4s.Final Answer:
rolls = np.random.randint(1, 7, size=1000) count_4 = np.sum(rolls == 4) -> Option CQuick Check:
Use randint for discrete uniform die rolls = rolls = np.random.randint(1, 7, size=1000) count_4 = np.sum(rolls == 4) [OK]
- Using binomial instead of uniform discrete
- Using normal distribution for discrete outcomes
- Forgetting replace=True in choice
Ready to prove it?
Pass the test and this pattern moves unknown
