Numpy: default_rng.integers(2 ** 32)は常に0を返します

作成日 2020年04月24日  ·  7コメント  ·  ソース: numpy/numpy

コード例の再現:

default_rng.integers(2**32)常に0を返すのに対し、 2**32-12**32+12**40などが期待どおりに乱数を返す理由がわかりません。 結果はnumpy.int64なので、最大2**64-1数を生成できると期待していました。

$ python3.7 -c 'from numpy.random import default_rng; rng=default_rng(); print([rng.integers(2**32) for _ in range(5)])'
[0, 0, 0, 0, 0]

2**40

$ python3.7 -c 'from numpy.random import default_rng; rng=default_rng(); print([rng.integers(2**40) for _ in range(5)])'
[386296210341, 896689857600, 958588149890, 364800985883, 643738305251]

Numpy / Pythonのバージョン情報:

私はPython3-3.7.6-2.fc31.x86_64とpython3-numpy-1.17.4-2.fc31.x86_64でFedora31を実行しています:

vstinner@apu$ python3.7
Python 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, numpy; print(numpy.__version__, sys.version)
1.17.4 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
00 - Bug 06 - Regression numpy.random high

最も参考になるコメント

問題はマスターにもあります:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.19.0.dev0+6d6df47'

In [3]: rng = np.random.default_rng()

In [4]: rng.integers(2**32, size=8)
Out[4]: array([0, 0, 0, 0, 0, 0, 0, 0])

これはおそらくhttps://github.com/numpy/numpy/pull/14777で導入されました

全てのコメント7件

おそらく、バックグラウンドで32ビットジェネレーターを使用して高速化しますが、誤って2**32 + 1を32ビットにキャストします。 それは間違いなくかなり深刻なバグです。

問題はマスターにもあります:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.19.0.dev0+6d6df47'

In [3]: rng = np.random.default_rng()

In [4]: rng.integers(2**32, size=8)
Out[4]: array([0, 0, 0, 0, 0, 0, 0, 0])

これはおそらくhttps://github.com/numpy/numpy/pull/14777で導入されました

@WarrenWeckesserに感謝し

管理する場合は、1.18.4に修正を含めるようにする必要があると思います。

@ seberg 、gh-14777は1.17にバックポートされました。

原因はhttps://github.com/numpy/numpy/pull/14501で、1.17.3にバックポートされていることがわかりました。 私は修正に取り組んでいます。

このページは役に立ちましたか?
0 / 5 - 0 評価