从手册:
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上试过这个,并且它们一遍又一遍地保持相同的结果。
答案 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还改变了-R
,str
和bytes
个对象的使用方式;他们通过种子通知使用他们的哈希值。