455,548 Members | 1,496 Online
Need help? Post your question and get tips & solutions from a community of 455,548 IT Pros & Developers. It's quick & easy.

# How to generate geometric random numbers?

 P: n/a Hi all, I am a newbie to Python and would like to genereate some numbers according to geometric distribution. However, the Python Random package seems do not have implemented functionality. I am wondering is there exist any other libraries that can do this job? Thanks a lot, Da Jul 23 '06 #1
9 Replies

 P: n/a On 2006-07-23 17:12:20, My***********@gmail.com wrote: I am a newbie to Python and would like to genereate some numbers according to geometric distribution. However, the Python Random package seems do not have implemented functionality. I am wondering is there exist any other libraries that can do this job? The usual way is to generate standard random numbers (linear distribution) and then apply whatever transformation you need to generate the desired distribution. Gerhard Jul 23 '06 #2

 P: n/a Gerhard Fiedler wrote: On 2006-07-23 17:12:20, My***********@gmail.com wrote: >I am a newbie to Python and would like to genereate some numbersaccording to geometric distribution. However, the Python Random packageseems do not have implemented functionality. I am wondering is thereexist any other libraries that can do this job? The usual way is to generate standard random numbers (linear distribution) and then apply whatever transformation you need to generate the desired distribution. That only works if there is such a transformation. The geometric distribution and many others have been implemented in numpy: http://www.scipy.org/NumPy In [1]: from numpy import random In [2]: random.geometric(0.5, size=100) Out[2]: array([1, 5, 2, 3, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, 2, 1, 2, 3, 2, 1, 1, 1, 1, 1, 3, 1, 1, 2, 6, 1, 1, 3, 2, 1, 1, 2, 1, 1, 7, 2, 1, 1, 2, 1, 1, 2, 4, 1, 2, 1, 4, 2, 1, 1, 2, 1, 4, 2, 1, 1, 3, 1, 3, 1]) -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco Jul 23 '06 #3

 P: n/a Robert Kern wrote: Gerhard Fiedler wrote: On 2006-07-23 17:12:20, My***********@gmail.com wrote: I am a newbie to Python and would like to genereate some numbers according to geometric distribution. However, the Python Random package seems do not have implemented functionality. I am wondering is there exist any other libraries that can do this job? The usual way is to generate standard random numbers (linear distribution) and then apply whatever transformation you need to generate the desired distribution. That only works if there is such a transformation. The geometric distribution and many others have been implemented in numpy: http://www.scipy.org/NumPy In [1]: from numpy import random In [2]: random.geometric(0.5, size=100) Out[2]: array([1, 5, 2, 3, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, 1, 1, 2, 1, 2, 3, 2, 1, 1, 1, 1, 1, 3, 1, 1, 2, 6, 1, 1, 3, 2, 1, 1, 2, 1, 1, 7, 2, 1, 1, 2, 1, 1, 2, 4, 1, 2, 1, 4, 2, 1, 1, 2, 1, 4, 2, 1, 1, 3, 1, 3, 1]) -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco Thanks a lot. I will try it out. But I am still surprised because the default Random package in Python can generate so few discrete random distritbuions, while it can generate quite a few continuous distribution, including some not very common one. Da Jul 24 '06 #4

 P: n/a My***********@gmail.com writes: But I am still surprised because the default Random package in Python can generate so few discrete random distritbuions, while it can generate quite a few continuous distribution, including some not very common one. It looks pretty simple to transform the uniform distribution to the geometric distribution. The formula for its cdf is pretty simple: cdf(p,n) = (1-p)**(n-1)*p For fixed p, if the cdf is c, we get (unless I made an error), n = log(c, 1-p) - 1 So choose a uniform point c in the unit interval, run it through that formula, and round up to the nearest integer. See http://en.wikipedia.org/wiki/Geometric_distribution for more about the distribution. Jul 24 '06 #5

 P: n/a Paul Rubin

 P: n/a Paul Rubin wrote: Paul Rubin n = log(c, 1-p) - 1 I meant n = log(c/p, 1-p) - 1 sorry. import random from math import ceil, log def geometric(p): """ Geometric distribution per Devroye, Luc. _Non-Uniform Random Variate Generation_, 1986, p 500. http://cg.scs.carleton.ca/~luc/rnbookindex.html """ # p should be in (0.0, 1.0]. if p <= 0.0 or p 1.0: raise ValueError("p must be in the interval (0.0, 1.0]") elif p == 1.0: # If p is exactly 1.0, then the only possible generated value is 1. # Recognizing this case early means that we can avoid a log(0.0) later. # The exact floating point comparison should be fine. log(eps) works just # dandy. return 1 # random() returns a number in [0, 1). The log() function does not # like 0. U = 1.0 - random.random() # Find the corresponding geometric variate by inverting the uniform variate. G = int(ceil(log(U) / log(1.0 - p))) return G -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco Jul 24 '06 #7

 P: n/a Robert Kern

 P: n/a Paul Rubin wrote: Robert Kern G = int(ceil(log(U) / log(1.0 - p))) I usually owuld write that as int(ceil(log(U, 1.0 - p))). Knock yourself out. I was cribbing from my C implementation in numpy. -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco Jul 24 '06 #9

 P: n/a Robert Kern

### This discussion thread is closed

Replies have been disabled for this discussion.