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.randomlike 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