Gergely Mathe
Gergely Mathe

Reputation: 113

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!

Upvotes: 1

Views: 1388

Answers (1)

Severin Pappadeux
Severin Pappadeux

Reputation: 20080

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

Upvotes: 1

Related Questions