Your friend is wrong, and he would know this if he read the documentation for the seed() function:
Initialize the random number generator. The optional argument x can be any hashed object. If x is omitted or None, the current system time is used; The current system time is also used to initialize the generator the first time the module is imported. If sources of randomness are provided by the operating system, they are used instead of system time (see os.urandom () for details on availability).
(Emphasize mine.)
He guesses, based on his knowledge of how he works in other languages. The seed() function is basically provided so that you can get a reproducible stream of pseudo random numbers (which is necessary for some specific applications).
The functions that you call directly from the random module are actually aliases of the methods of the hidden instance of the random.Random class. Each instance, at least in essence, calls seed() inside its __init__() .
The choice() function obviously does not call seed() before the operation, because it will mean re-sowing before each choice that defeats the sowing goal.
source share