Testing random
Peter Otten
__peter__ at web.de
Sun Jun 7 09:35:55 EDT 2015
Steven D'Aprano wrote:
>> I wrote a very simple function to test random:
>> def test_random(length, multiplier = 10000):
>> number_list = length * [0]
>> for i in range(length * multiplier):
>> number_list[random.randint(0, length - 1)] += 1
>> minimum = min(number_list)
>> maximum = max(number_list)
>> return (minimum, maximum, minimum / maximum)
>
> Putting aside the timing aspects, your frequency calculations are not done
> in a very Pythonic manner.
I would agree if the frequency table were sparse, i. e. many indices with
number_list[index] == 0
but that's not the case with on average 10000 hits per index.
> A better way might be:
I'm too lazy to measure, but this will likely be a tad slower. Did you mean
to convey this by "Putting aside the timing aspects"?
> from collections import Counter
> from random import randint
>
> def test_random(length, multiplier = 10000):
> freq = Counter(
> randint(0, length - 1) for i in range(length * multiplier)
> )
> minimum = min(freq[i] for i in range(length))
How about
if len(freq) < length:
minimum = 0
else:
minimum = min(freq.values())
Not as an optimisation (replacing randint() with randrange() is probably
more effective in that department), but because it's closer to being self-
explanatory.
> maximum = max(freq.values())
> return (minimum, maximum, minimum / maximum)
More information about the Python-list
mailing list