44

In python, and assuming I'm on a system which has a random seed generator, how do I get random.seed() to use system time instead? (As if /dev/urandom did not exist)

Academiphile
  • 1,434
  • 2
  • 13
  • 21

4 Answers4

68
import random
from datetime import datetime
random.seed(datetime.now().timestamp())
Quint
  • 1,146
  • 12
  • 12
  • 1
    For those wondering why this solution is preferred over `time.time()` as a seed, `time.time()` may have only second-level precision on some operating systems. `datetime.now()` creates a seed with [microsecond level detail](https://www.codecademy.com/resources/docs/python/dates/now). – Madhav Malhotra Apr 29 '23 at 14:54
28

you can do

import random
import time
random.seed(time.time())
Elisha
  • 4,811
  • 4
  • 30
  • 46
  • 1
    from that link:"If randomness sources are provided by the operating system, they are used instead of the system time (see the os.urandom() function for details on availability)." This is what I'm trying to avoid. – Academiphile Dec 03 '14 at 16:02
  • so I didn't understand your question, what are you looking for? – Elisha Dec 03 '14 at 16:04
  • are you looking for `random.seed(time.time())`? – Elisha Dec 03 '14 at 16:05
8

Do you know this library: PyRandLib? See:

https://schmouk.github.io/PyRandLib/ to easily download archives versions, and
https://github.com/schmouk/PyRandLib to get access to the code.

This library contains many of the best-in-class pseudo-random numbers generators while acting exactly as does the Python "built-in" library random (just un-zip or un-tar the downloaded archive in the 'Lib/site-packages/' sub-directory of your Python directory).

From the code, and from module 'fastrand32.py', you'll get a quite more sophisticated way to feed random with a shuffled version of current time. For your purpose, this would become:

import time
import random

t = int( time.time() * 1000.0 )
random.seed( ((t & 0xff000000) >> 24) +
             ((t & 0x00ff0000) >>  8) +
             ((t & 0x0000ff00) <<  8) +
             ((t & 0x000000ff) << 24)   )

This provides a main advantage: for very short periods of time, the initial seeds for feeding the pseudo-random generator will be hugely different between two successive calls.

Schmouk
  • 327
  • 2
  • 6
  • 1
    Hi Schmouk! I'm not confident with the syntax used for the final expression used for the seed (the argument of `random.seed()` ). Can you explain me how `t` value is modified by that expression? – user1172131 Apr 11 '22 at 11:13
  • 1
    i ran your expression to print five seeds in a loop, several times, and unfortunately the seeds are quite close, at least on a log scale, and usually repeat (i.e., 2/5 are often identical). might need more significant digits from time() and a tweaked formula. – Salmonstrikes Jul 12 '22 at 20:42
4

As of day, Dec 2021, the better option is to use methods from "secrets" module. You don't need to set such seed anymore.

Sample Code:

import secrets
print (secrets.randbelow(1_000_000_000))
alinsoar
  • 15,386
  • 4
  • 57
  • 74
M2014
  • 1,094
  • 1
  • 9
  • 16