Jun-geun Park wrote: > Ivan Voras wrote: >> Hi, >> >> I have a list of items, and need to choose several elements from it, >> "almost random". The catch is that the elements from the beginning >> should have more chance of being selected than those at the end (how >> much more? I don't care how the "envelope" of probability looks like at >> this point - can be linear). I see that there are several functions in >> Python standard libraries for various distribution, but is there an easy >> pythonic way to make them do what I need? >> >> > > That's weird. random.randint(a,b) will be enough for most cases. Test > your system to see the distribution is uniform with something like: > > ---- > import random > > dist = {} > for z in xrange(100000): > u = random.randint(1,10) > try: > dist[u] = dist[u] + 1 > except KeyError: > dist[u] = 1 > > print dist > ----
I understood the question wrong.(Thanks, Grant and Robert.) To get the linear distribution, you can start from the following: a = (random.random() + random.random())/2.0 # Triangle distribution in [0,1) b = random.random() # Uniform in [0,1) c = b + (1-b)*a # Convolution u = int(100*(1-c)+1) # ceil(100*(1-c)) , then, because convolution of a rectangle function and a triangle function is a linear function under the valid domain, u is a random integer in [1,100] that follows (decreasing) linear distribution. Alternatively if I were in your case, I would go with an exponential random with a suitable lambda(by cutting its tail.) -- http://mail.python.org/mailman/listinfo/python-list