Coding questions · Upstart
Simulate Radioactive Decay to Validate Analytical Solution
This question evaluates a candidate's ability to implement Monte Carlo simulations and validate analytical probability results, testing skills in stochastic processes, numerical estimation, and programming within the Coding & Algorithms domain for data scientist roles.
Scenario
Same radioactive-decay problem, but now validate the analytical answer via simulation during the interview.
Question
Share screen and write runnable code (any language) that Monte-Carlo simulates the decay of 100 particles, repeats many trials, and estimates the survival probability computed above.
Hints
Generate exponential or Bernoulli survival, loop many trials, collect frequencies, compare to theoretical value.
Radioactive Decay: Analytical Survival Probability
A classic interview follow-up to the radioactive-decay problem asks you to Monte-Carlo simulate the decay of N particles and compare the empirical survival frequency to the analytical answer. The quantity the simulation converges to is deterministic, so implement that analytical target directly.
For a single radioactive particle with decay rate (lambda) decay_rate, the probability it has NOT decayed by time t is exp(-decay_rate * t). For num_particles independent identical particles, the expected number still alive at time t is num_particles * exp(-decay_rate * t).
Write a function survivalEstimate(decay_rate, time, num_particles) that returns a list [survival_prob, expected_survivors] where:
survival_probisexp(-decay_rate * time)rounded to 6 decimal places,expected_survivorsisnum_particles * survival_probrounded to 4 decimal places.
This is exactly the value a long Monte-Carlo run (Bernoulli survival per particle, averaged over many trials) converges to.
Robustness: treat a negative decay_rate or negative time as no decay (survival probability 1.0), and treat a non-positive num_particles as 0 particles (0 expected survivors).
Examples:
survivalEstimate(0.5, 2.0, 100)->[0.367879, 36.7879](since exp(-1.0) ~= 0.3678794).survivalEstimate(0.0, 5.0, 100)->[1.0, 100.0](no decay).survivalEstimate(0.693147, 1.0, 80)->[0.5, 40.0](one half-life: exp(-ln2) = 0.5).
Constraints
- 0.0 <= decay_rate <= 100.0 (negative values are treated as 0)
- 0.0 <= time <= 1e4 (negative values are treated as 0)
- 0 <= num_particles <= 1e9 (negative values are treated as 0)
- survival_prob is rounded to 6 decimal places
- expected_survivors is rounded to 4 decimal places
Hints
- The probability a single particle survives to time t is exp(-decay_rate * t). This is the limit a Monte-Carlo Bernoulli simulation converges to as trials grow.
- Multiply the per-particle survival probability by num_particles to get the expected number of survivors — no loop or random sampling is required for the analytical target.
- Guard the edge cases: a zero (or negative) decay_rate or time means survival probability 1.0; a half-life corresponds to decay_rate * time = ln(2), giving probability exactly 0.5.