Search code examples
pythonrandomnumbersintegeruniform-distribution

generating uniform distribution of integeres with python


I tried to generate an uniform distribution of random integeres on a given interval (it's unimportant whether it contains its upper limit or not) with python. I used the next snippet of code to do so and plot the result:

import numpy as np
import matplotlib.pyplot as plt
from random import randint

propsedPython = np.random.randint(0,32767,8388602)%2048
propsedPythonNoMod = np.random.randint(0,2048,8388602)
propsedPythonNoModIntegers = np.random.random_integers(0,2048,8388602)
propsedPythonNoModRandInt = np.empty(8388602)
for i in range(8388602):
    propsedPythonNoModRandInt[i] = randint(0,2048)

plt.figure(figsize=[16,10])
plt.title(r'distribution $\rho_{prop}$ off all the python simulated proposed indices')
plt.xlabel(r'indices')
plt.ylabel(r'$\rho_{prop}$')
plt.yscale('log')
plt.hist(propsedPython,bins=1000,histtype='step',label=r'np.random.randint(0,32767,8388602)%2048')
plt.hist(propsedPythonNoMod,bins=1000,histtype='step',label=r'np.random.randint(0,2048,8388602')
plt.hist(propsedPythonNoModIntegers,bins=1000,histtype='step',label=r'np.random.random_integers(0,2048,8388602)')
plt.hist(propsedPythonNoModRandInt,bins=1000,histtype='step',label=r'for i in range(8388602):propsedPythonNoModRandInt[i] = randint(0,2048)')
plt.legend(loc=0)

The resulting plot is:enter image description here Could somebody point me in the right direction why these spikes appear in al the different cases and or gives some advice which routine to use to got uniformly distributed random integers?

Thanks a lot!


Solution

  • Mmm...

    I used new NumPy rng facility, and graph looks ok to me.

    Code

    import numpy as np
    import matplotlib.pyplot as plt
    
    rng = np.random.default_rng()
    
    N = 1024*500
    
    hist = np.zeros(2048, dtype=np.int32)
    
    q = rng.integers(0, 2048, dtype=np.int32, size=N, endpoint=False)
    
    for k in range(0, N):
        hist[q[k]] += 1
    
    x = np.arange(0, 2048, dtype=np.int32)
    
    fig, ax = plt.subplots()
    ax.stem(x, hist, markerfmt=' ')
    plt.show()
    

    and graph

    enter image description here