This is how I generate random timing and determine which subperiods players can make a move. import numpy as np num_subperiods=6000 updating_time=0.1 # in seconds players_per_group=2 gap=2 # in seconds total_seconds = num_subperiods*updating_time draws = np.random.default_rng().exponential(scale=gap/updating_time,size=(players_per_group,num_subperiods)) check_interval = draws < updating_time num_false = np.sum(check_interval) if num_false>0: draws[check_interval] = np.random.default_rng().exponential(scale=gap/updating_time,size=num_false) timing = np.cumsum(draws,axis=1) new_timing = timing.copy() new_timing[timing>num_subperiods]=num_subperiods bins = np.arange(0,num_subperiods) new_timing = np.digitize(new_timing,bins) is_revise = np.zeros((players_per_group,num_subperiods)) np.put_along_axis(is_revise,new_timing-1,1,axis=1) is_revise[np.any(timing>num_subperiods,axis=1),num_subperiods-1]=0 I am thinking to make it discrete, using updating_time as a unit. The other part of my code uses updating_time as a discrete interval, so exponential is not really consistent with that, though the original idea was to use a small updating_time to make it visually continuous. How should do I it? Using Geometric Distribution or Poisson Distribution? or I should stick to exponential? Continue reading...