Você já fez muitas observações corretas!
A menos que você queira semear os dois geradores aleatórios, provavelmente é mais simples no longo prazo escolher um ou outro. Mas se você precisar usar ambos, então sim, você também precisará semear os dois, porque eles geram números aleatórios independentemente um do outro.
Pois numpy.random.seed()
, a principal dificuldade é que não é seguro para thread - isto é, não é seguro usar se você tiver muitos threads diferentes de execução , porque não é garantido que funcione se duas threads diferentes estiverem executando a função ao mesmo tempo. Se você não estiver usando threads, e se puder razoavelmente esperar que não precise reescrever seu programa dessa maneira no futuro, tudo numpy.random.seed()
bem. Se houver alguma razão para suspeitar que você possa precisar de threads no futuro, é muito mais seguro a longo prazo fazer conforme sugerido e criar uma instância local da numpy.random.Random
classe . Pelo que eu posso dizer, random.random.seed()
é thread-safe (ou pelo menos, não encontrei nenhuma evidência do contrário).
A numpy.random
biblioteca contém algumas distribuições de probabilidade extras comumente usadas em pesquisas científicas, bem como algumas funções de conveniência para gerar matrizes de dados aleatórios. A random.random
biblioteca é um pouco mais leve e deve funcionar se você não estiver fazendo pesquisas científicas ou outros tipos de trabalho em estatística.
Caso contrário, ambos usam a sequência de torção de Mersenne para gerar seus números aleatórios e são completamente determinísticos - ou seja, se você souber algumas informações importantes, é possível prever com certeza absoluta qual número virá a seguir . Por esse motivo, nem numpy.random nem random.random é adequado para qualquer uso criptográfico sério . Mas, como a sequência é muito longa, ambos são adequados para gerar números aleatórios nos casos em que você não está preocupado com as pessoas tentando fazer a engenharia reversa de seus dados. Esta também é a razão para a necessidade de semear o valor aleatório - se você começar no mesmo lugar todas as vezes, sempre obterá a mesma sequência de números aleatórios!
Como uma nota lateral, se você não precisa aleatoriedade nível de criptografia, você deve usar a segredos módulo, ou algo parecido Crypto.Random se você estiver usando uma versão do Python mais cedo do que Python 3.6.
random.random
sozinho. Você geralmente não precisa disso, no entanto.Do Python for Data Analysis , o módulo
numpy.random
complementa o Pythonrandom
com funções para gerar matrizes inteiras de valores de amostra de vários tipos de distribuição de probabilidade de maneira eficiente.Por outro lado, o
random
módulo integrado do Python mostra apenas um valor por vez, enquantonumpy.random
pode gerar uma amostra muito grande mais rápido. Usando a função mágica do IPython,%timeit
é possível ver qual módulo tem desempenho mais rápido:fonte
np.random.randint(2)
comrandom.randrange(2)
e NumPy era mais lento . NumPy: 1,25 us e Random: 891 ns. E também a mesma relação paranp.random.rand()
erandom.random()
.A fonte da semente e o perfil de distribuição usado afetarão as saídas - se você estiver procurando por aleatoriedade criptográfica, a propagação de os.urandom () obterá bytes aleatórios quase reais da vibração do dispositivo (ou seja, ethernet ou disco) (ou seja / dev / random no BSD)
isso evitará que você forneça uma semente e, assim, gere números aleatórios determinísticos. No entanto, as chamadas aleatórias permitem que você ajuste os números a uma distribuição (o que eu chamo de aleatoriedade científica - eventualmente, tudo o que você quer é uma distribuição em curva de sino de números aleatórios, numpy é o melhor em fornecer isso.
ASSIM, sim, fique com um gerador, mas decida o que você quer aleatório - aleatório, mas definitivamente a partir de uma curva de distribuição, ou tão aleatório quanto você pode obter sem um dispositivo quântico.
fonte