Flat "geometric distribution" by varying the probability of the Bernoulli trail In a simulation I am working on, each day (time step) there is a chance that a condition changes (at which point it is stuck in the changed condition). Setting this probability to a fixed value (say 5%) gives a geometric distribution (or exponential in the continuous case) for the time it takes for the change to happen. I would like to make the probability of the change time varying so that the distribution of times it takes for the change to happen is uniform. Is there a way to accomplish this?
 A: So I sat down with pen and paper and worked on this some last night. Here is what I have:
Let the probability for the Bernoulli trial at time $t$ by $p(t) = p_t$. We can then write out the PMF for the first trial success ($pmf(t)$). First I will list a few points:
$$pmf(1) = p_1$$
$$pmf(2) = (1-p_1)p_2$$
$$pmf(3) = (1-p_1)(1-p_2)p_3$$
This gives:
$$pmf(t) = p_t\prod_{i=1}^{t-1}(1-p_i)$$
Now my goal is for the PMF to be flat instead of exponential so we want $pmf(t)=pmf(\tau)$. Again we will show some examples:
$$pmf(1)=pmf(2)\rightarrow p_1=(1-p_1)p_2\rightarrow p_2=\frac{p_1}{1-p_1}$$
$$pmf(1)=pmf(3)\rightarrow p_1=(1-p_1)(1-p_2)p_3=(1-p_1)(1-\frac{p_1}{1-p_1})p_3\rightarrow p_3=\frac{p_1}{1-2*p_1}$$
Leaving the induction proof as an exercise to the reader we find:
$$p_i=\frac{p_1}{1-(i-1)p_1}$$
A couple of things to bear in mind:


*

*There is a vertical asymptote as $t\rightarrow\frac{1}{p_1}$

*Taking discrete steps you might hop over the asymptote ($\frac{1}{p_1}$ in not an integer) and get negative "probabilities"

*The CDF is linearly increasing instead of logarithmicly and will hit 1 when $t=\frac{1}{p_1}$
Next to test this out:
import numpy as np
import matplotlib.pyplot as plt

def pmfDist(p1):
    p = p1/(1-p1*np.arange(round(1/p1)))
    if (1-p[-1])<1:
        p[-1] = 1
    pmf = np.cumprod(1-p)*p
    return pmf

p1=0.005
pmf005 = pmfDist(p1)

p1=0.01
pmf01 = pmfDist(p1)

p1=0.03
pmf03 = pmfDist(p1)

p1=0.05
pmf05 = pmfDist(p1)

p1=0.10
pmf10 = pmfDist(p1)

plt.plot(pmf005)
plt.plot(pmf01)
plt.plot(pmf03)
plt.plot(pmf05)
plt.plot(pmf10)
plt.legend(['0.5%', '1%', '3%', '5%', '10%'])
plt.title('PMF with different p_1 values')
plt.xlabel('t')
plt.ylabel('pmf(t)')
print(sum(pmf005))
print(sum(pmf01))
print(sum(pmf03))
print(sum(pmf05))
print(sum(pmf10))


For smaller $p_1$ these look pretty flat, I believe the dips at the ends are due to numeric error as we approach the asymptote and that the larger $p_1$ values experience this faster and so do not show a flat area.
