python随机播种是确定性的,但它不应该是

时间:2016-11-03 08:18:34

标签: python python-2.7 random

从手册:

  

random.seed([X])

     

初始化基本随机数生成器。   可选参数x可以是任何可哈希对象。如果省略x或   无,使用当前系统时间;当前系统时间也用于   首次导入模块时初始化生成器。如果   随机源由操作系统提供,它们被使用   而不是系统时间(有关详细信息,请参阅os.urandom()函数   可用性)。

     

如果给出可清洗对象,则仅确保确定性结果   当PYTHONHASHSEED被禁用时。

user@MacBook:~$ python
Python 2.7.11 (default, Aug  6 2016, 02:11:50) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> r = random.Random('somelongstring' * 40)
>>> r.randint(1, 1000)
332
>>> exit()

user@MacBook-Pro:~$ python
Python 2.7.11 (default, Aug  6 2016, 02:11:50) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> r = random.Random('somelongstring' * 40)
>>> r.randint(1, 1000)
332
>>> 

麻烦的是,我每次都试图获得相同的结果,但根据手册和PYTHONHASHSEED,我每次都会得到相同的结果。我在mac os,linux,python2.7和pypy上试过这个,并且它们一遍又一遍地保持相同的结果。

1 个答案:

答案 0 :(得分:6)

要禁用var app = require('server.js'). app.get('/', function (req, res) { res.send('Hello World!'); }); 默认值;除非您明确启用它,否则Python 2中没有随机散列。它故意在Python 2中保持可选,以避免破坏依赖于散列在Python进程中稳定的应用程序,它只是Python 3的默认设置。

如果您要启用它(使用-R command line switch或环境变量)那么您确实看到了不同之处:

PYTHONHASHSEED

来自$ python2.7 -R -c "import random; random.seed('somelongstring' * 40); print random.randint(1, 1000)" 955 $ python2.7 -R -c "import random; random.seed('somelongstring' * 40); print random.randint(1, 1000)" 277 切换文档:

  

更改哈希值会影响从dict检索密钥的顺序。虽然Python从未对这种排序做出保证(并且它通常在32位和64位构建之间有所不同),但是足够的现实代码隐含地依赖于这种非保证行为,默认情况下禁用随机化。

Python 3还改变了-Rstrbytes个对象的使用方式;他们通过种子通知使用他们的哈希值。