Numpy: default_rng.integers (2 ** 32) renvoie toujours 0

Créé le 24 avr. 2020  ·  7Commentaires  ·  Source: numpy/numpy

Exemple de code de reproduction:

Je ne comprends pas pourquoi default_rng.integers(2**32) renvoie toujours 0, alors que 2**32-1 , 2**32+1 , 2**40 , etc. renvoient des nombres aléatoires comme prévu. Le résultat est un numpy.int64 , donc je m'attendais à pouvoir générer des nombres allant jusqu'à 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]

C'est bien avec 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]

Informations sur la version Numpy / Python:

J'exécute Fedora 31 avec python3-3.7.6-2.fc31.x86_64 et python3-numpy-1.17.4-2.fc31.x86_64:

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

Commentaire le plus utile

Le problème est également en master:

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])

Cela a probablement été introduit dans https://github.com/numpy/numpy/pull/14777. Je regarderai.

Tous les 7 commentaires

Il utilise probablement un générateur 32 bits en arrière-plan pour des vitesses plus élevées, mais jette ensuite 2**32 + 1 en 32 bits par accident! C'est définitivement un bug assez sérieux.

Le problème est également en master:

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])

Cela a probablement été introduit dans https://github.com/numpy/numpy/pull/14777. Je regarderai.

Merci @WarrenWeckesser , le problème est également dans la version 1.17, il est donc peut-être plus ancien que votre commit. Mais je pense que maintenant, cela va aussi loin dans le code et vous semblez connaître cette partie. Tellement génial, envisageait juste de cingler Kevin :).

Si nous y parvenons, nous devrions essayer d'inclure le correctif dans 1.18.4 je pense.

@seberg , gh-14777 a été rétroporté à 1.17.

Il s'avère que la cause est https://github.com/numpy/numpy/pull/14501 , qui a été rétroportée à 1.17.3. Je travaille sur un correctif.

Le correctif proposé est sur https://github.com/numpy/numpy/pull/16076

Cette page vous a été utile?
0 / 5 - 0 notes