I want a function which takes, as input, the number of seconds elapsed since the last time it was called, and returns true or false for whether an event should have happened in that time period. I want it such that it will fire, on average, once per X time passed, say 5 seconds. I also am interested if it’s possible to do without any state, which the answer from this question used.
I guess to be fully accurate it would have to return an integer for the number of events that should’ve happened, in the case of it being called once every 10*X times or something like that, so bonus points for that!
It sounds like you’re describing a Poisson process, with the mean number of events in a given time interval is given by the Poisson distribution with parameter lambda=1/X.
The way to use the expression on the latter page is as follows, for a given value of lambda, and the parameter value of t:
exp(-lambda*t) * (lambda*t)**0 / factorial(0))Note that, yes, this can end up with more than one event in a time period, if t is large compared with 1/lambda (ie X). If t is always going to be small compared to 1/lambda, then you are very unlikely to get more than one event in the period, and so the algorithm is simplified considerably (if p < exp(-lambda*t), then 0, else 1).
Note 2: there is no guarantee that you will get at least one event per interval X. It’s just that it’ll average out to that.
(the above is rather off the top of my head; test your implementation carefully)