I am porting the application from python 2 to python 3 and encountered the following problem: random.randint
returns different result according to used Python version. So
import random
random.seed(1)
result = random.randint(1, 100)
On Python 2.x result will be 14 and on Python 3.x: 18
Unfortunately, I need to have the same output on python3 to have backward compatibility of service.
Now I have only working idea of usage subprocess
module from Python 3.x to execute Python 2.x code
result = subprocess.check_output(
'''python2 -c "import random; random.seed('%s'); print(random.randint(1, 100))"''' % seed,
shell=True
)
But such an approach is slower approx. in 1000 times than execute just random.randint(1, 100)
.
Maybe there are other approaches to do this?
The seed() method is used to initialize the random number generator. The random number generator needs a number to start with (a seed value), to be able to generate a random number. By default the random number generator uses the current system time.
randint() function to get a random integer number from the inclusive range. For example, random. randint(0, 10) will return a random number from [0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 10].
A random seed is a starting point in generating random numbers. A random seed specifies the start point when a computer generates a random number sequence. This can be any number, but it usually comes from seconds on a computer system's clock (Henkemans & Lee, 2001).
Python Random randint() Method The randint() method returns an integer number selected element from the specified range. Note: This method is an alias for randrange(start, stop+1) .
Finally found the answer!
Sparky05 give interesting idea and was near with int(1+99*random.random())
.
But the right answer is
random.seed(seed, version=1)
int(random.random() * 100) + 1
in Python 3.x
Works in the same way like
random.seed(seed)
random.randint(1, 100)
in Python 2.x
The difference is caused by two things:
random.seed(42, version=1)
random.randrange
, which is called by random.randint
and probably add to above issue.So use something like:
try: random.seed(42, version=1) # Python 3
except TypeError: random.seed(42) # Python 2
and int(1+random.random()*99)
.
Backward compatibility was on purpose dropped with the change of randrange
, see the original issue.
See this reddit post.
If possible use numpy.random
like is proposed in the reddit post.
Use of random.seed(42, version=1)
as described in the documentation will cause random.random()
to deliver the same result but give a different result for random.randint(1,100)
(because in python 3.2 some problem with the old implementation was fixed). You may opt to only rely on something like int(1+random.random()*99)
.
(Python 2 will run out of support very soon, soon2 or here. If possible check, if backward compatibility is really needed.)
My current tests:
import random
try: random.seed(42, version=1) # Python 3
except TypeError: random.seed(42) # Python 2
print(random.random())
print(int(1+99*random.random()))
print(random.randint(1,99))
Results on Python 2
0.639426798458
3
28
and Python 3
0.6394267984578837
3
36
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With