from time import time

def baseRandom():
    return hash(str(time()))

def randFromZero(maximum):
    return baseRandom() % maximum

def randRange(minimum, maximum):
    return randFromZero(maximum - minimum) + minimum

I ask what's wrong because it seems so simple and stupid. This is something I just thought up one day and put together in 5 minutes, but it seems to generate even and unpredictable results. I've done a couple of simple tests like generating a lot of numbers and looking at the variance between the amount of times each number is generated, and using it to create a little grid which has tiles that are either black or white with equal probability, in which I saw no clear patterns. Hopefully someone who knows a thing or two about this can educate me.

  • \$\begingroup\$ How are you intending to use the "random" output? Why aren't you using the builtin random functions? \$\endgroup\$
    – JeffS
    Apr 25 '14 at 19:24
  • \$\begingroup\$ @JeffS I'm not intending to use it and always use the built-in functions. This is just a bit of fun. \$\endgroup\$ Apr 25 '14 at 19:35
  • 2
    \$\begingroup\$ The time() function returns quantized time; the least significant digits of the time are "chunky" and usually represent a small subset of available numbers. Hashing the string will introduce more clumpiness; ASCII strings tend to be very sparse, and you are taking the string of a number. The hash function will map to a very small portion of the integer space. Now, the modulus of a small portion of the integer space is an even smaller portion. \$\endgroup\$ Apr 25 '14 at 19:50
  • \$\begingroup\$ Worth saying, that (although small) there is a chance that if you run this program on two computers with synchronized clocks they will both generate the same numbers. You could (just for fun) append the PID to what gets hashed. Also, if someone wanted, they could use it to generate the entire series of possible numbers your program could have used in a given time period. It looks a little like you have written a poorly seeded PRNG :), consider (for fun) adding more sources of randomish data to the hash input. \$\endgroup\$
    – IanNorton
    Aug 7 '14 at 6:20

It looks like you're relying on running this on a system where the granularity of the time() function is smaller than the amount of time it takes to execute baseRandom(), do what you want with the results, and come back to call baseRandom() again. If not, you'll get more repeating numbers than you should. You're also relying on the result of the hash() function to be sufficiently pseudorandom given the input you're feeding to it.

Detecting an obvious pattern depends on how you look for it. I think Knuth gave an example of a RNG that looked OK when you plotted pairs of numbers on an x-y plane, but if you took three numbers in a row as x-y-z coordinates, and look at the resulting cube from the right direction, you can clearly see a finite number of planes where all the outcomes lie. In other words, just because you tried a couple of things and didn't see a pattern doesn't mean a non-random pattern isn't there.

There are fifteen tests for randomness listed here, if you're interested: http://csrc.nist.gov/groups/ST/toolkit/rng/stats_tests.html


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.