Não entendo por que default_rng.integers(2**32)
sempre retorna 0, enquanto 2**32-1
, 2**32+1
, 2**40
, etc. retorna números aleatórios conforme o esperado. O resultado é numpy.int64
, então esperava ser capaz de gerar números de até 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]
Tudo bem com 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]
Estou executando o Fedora 31 com python3-3.7.6-2.fc31.x86_64 e 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)]
Provavelmente ele usa um gerador de 32 bits em segundo plano para velocidades mais altas, mas então converte 2**32 + 1
para 32 bits por acidente! É definitivamente um bug muito sério.
O problema está no mestre também:
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])
Isso provavelmente foi introduzido em https://github.com/numpy/numpy/pull/14777. Vou dar uma olhada.
Obrigado @WarrenWeckesser , o problema também está no 1.17, então pode ser mais antigo que o seu commit. Mas acho que agora isso vai tão fundo no código e você parece saber essa parte. Tão bom, estava pensando em pingar Kevin :).
Se conseguirmos, devemos tentar incluir a correção em 1.18.4, eu acho.
@seberg , gh-14777 foi retransmitido para 1.17.
Acontece que a causa é https://github.com/numpy/numpy/pull/14501 , que foi portada para 1.17.3. Estou trabalhando em uma correção.
A correção proposta está em https://github.com/numpy/numpy/pull/16076
Comentários muito úteis
O problema está no mestre também:
Isso provavelmente foi introduzido em https://github.com/numpy/numpy/pull/14777. Vou dar uma olhada.