La plupart d'entre nous savent que la commande random.randint(1,n)
en Python (2.X.X) génère un nombre aléatoire (pseudo-aléatoire entre 1 et n. Je suis intéressé à savoir ce qui est la limite supérieure pour n ?
OriginalL'auteur Arkapravo | 2010-04-08
randint()
travaille avec des entiers longs, donc il n'y a pas de limite supérieure:par la mise en œuvre de grands entiers
Bien que
randint()
peut soulever une RuntimeError de "aléatoire sous-jacent() générateur ne fournit pas assez de bits pour choisir à partir d'une population de gamme de cette grande" sur une machine avec peu ou pas d'entropie. Le code de la random.py est jolie intelligente sur la droite.Bendersky : Pouvez-vous nous en dire davantage ? .... J'avais lu sur le Mersenne Twister, mais pas arbitraire de précession entier !
traditionnellement, les services de renseignements nécessaires à l'ajustement dans 4 octets, de sorte qu'ils ont été limités à environ 4,3 milliards de chiffres, mais si vous ne placez pas une contrainte de mémoire sur le stockage de l'entier, et laissez résident dans 8, ou 16, ou 1000 octets, vous êtes limité que par la quantité de mémoire dont vous disposez.
OriginalL'auteur sth
Vous avez sans doute une délimitée quantité de mémoire, et l'adresse de l'espace, sur votre machine; par exemple, pour une machine 64 bits, 64 GO de RAM [[à propos de la
2**36
octets]] et un couple de to de disque (utilisable comme espace d'échange de la mémoire virtuelle) [[a propos de2**41
octets]]. Ainsi, la "limite supérieure" d'un Python de type entier long sera le plus grand représentable dans la mémoire disponible-un peu moins de256**(2**40)
si vous êtes dans absolument pas pressé et pourrez échanger comme un fou, un peu plus de256**(2*36)
(avec juste un peu de permutation, mais pas trop beaucoup) dans la pratique.Malheureusement, il serait prendre un peu de temps et de l'espace pour représenter ces ridiculement énorme nombres en décimal, donc, au lieu de leur montrer, permettez-moi de vérifier de retour avec vous, pourquoi voudriez-vous même soins à propos d'un tel ridicule succession de chiffres pour constituer la "limite supérieure", vous êtes curieux? Je pense que c'est plus pratique de le mettre de cette façon: en particulier sur une machine 64 bits décent avec des quantités de mémoire vive et du disque, les limites supérieures des entiers longs sont façon plus grand que tout ce que vous aurez jamais calculer. Techniquement, un mathématicien voudrais insister, ils sont pas l'infini, bien sûr... mais en pratique, ils pourraient aussi bien être!-)
Je pense qu'il est sûr de supposer que son souci était qu'aléatoire.randint pourrait ne pas accepter l'arbitraire de la taille des entiers, plutôt que de l'arbitraire de la taille des entiers ne supporterais pas une assez haute limite supérieure pour ses fins.
Eh bien, j'avais une opinion qu'une algorithmique de la pédagogie ne peut pas générer des nombres entiers à volonté, sans limite ! .... suppose que j'ai eu tort !
Je crois qu'il y a "illimité entiers" dans les bibliothèques standard de Java et de Matlab, mais je ne suis pas sûr au sujet de la mise en œuvre. Pour C++, vous devez les bibliothèques de tiers tels que des BPF ou MPIR -- ils sont certainement mis en œuvre de même pour Python.
si vous voulais représenter
2**19937-1
comme un Python (ou toute autre langue), vous auriez besoin d'acheter beaucoup plus d'octets de mémoire qu'il y a d'atomes dans l'Univers, même si vous avez trouvé un quantum computing moyen de stocker un googol octets par atome. Pas plus problématique que d'une Machine de Turing est "infini bande", bien sûr.OriginalL'auteur Alex Martelli