Il file random.random() di python restituisce sempre 1.0 o restituisce solo fino a 0.9999 ..?Intervallo di python's random.random() dalla libreria standard
risposta
documenti sono qui: http://docs.python.org/library/random.html
... random(), che genera un galleggiante casuale uniformemente nell'intervallo semiaperto [0.0, 1.0).
Quindi, il valore restituito sarà maggiore o uguale a 0 e inferiore a 1.0.
Per una spiegazione della notazione intervallo parentesi/parent, guarda qui: http: //en.wikipedia. org/wiki/Interval_ (matematica) #Terminology –
Penso che il sistema di aiuto interno di Python (come menzionato in un'altra risposta) sia molto più immediatamente accessibile quando si programma in Python. 'help (random.random)' avrebbe dato all'OP le informazioni di cui aveva bisogno. – Omnifarious
È molto meglio collegarsi alla vera documentazione quando scrivi su una pagina web. –
La funzione di Python random.random
restituisce numeri inferiori a, ma non uguali a, 1
.
Tuttavia, è possibile restituire 0
.
random() -> x nell'intervallo [0, 1) Cioè, incluso 0. – telliott99
@ telliott99: Questo è (quasi) esattamente ciò che ho detto. – SLaks
+1 per essere l'unica risposta a non fare affidamento sulla notazione matematica sci-fi! –
>>> help(random.random)
Help on built-in function random:
random(...)
random() -> x in the interval [0, 1).
Ciò significa che 1 è escluso.
Mi piace la tua risposta migliore. Python ha un fantastico sistema di aiuto interno e le persone dovrebbero essere incoraggiate a usarlo. – Omnifarious
Le altre risposte hanno già chiarito che 1 non è incluso nell'intervallo, ma per curiosità, ho deciso di guardare la fonte per vedere esattamente come è calcolato.
source CPython possono essere trovate here
/* random_random is the function named genrand_res53 in the original code;
* generates a random number on [0,1) with 53-bit resolution; note that
* 9007199254740992 == 2**53; I assume they're spelling "/2**53" as
* multiply-by-reciprocal in the (likely vain) hope that the compiler will
* optimize the division away at compile-time. 67108864 is 2**26. In
* effect, a contains 27 random bits shifted left 26, and b fills in the
* lower 26 bits of the 53-bit numerator.
* The orginal code credited Isaku Wada for this algorithm, 2002/01/09.
*/
static PyObject *
random_random(RandomObject *self)
{
unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6;
return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));
}
Quindi la funzione genera efficacemente m/2^53
dove 0 <= m < 2^53
è un numero intero. Poiché i float hanno normalmente una precisione di 53 bit, ciò significa che nell'intervallo [1/2, 1), viene generato ogni possibile movimento. Per valori più vicini a 0, salta alcuni possibili valori float per l'efficienza ma i numeri generati sono distribuiti uniformemente all'interno dell'intervallo. Il maggior numero possibile generato da random.random
è proprio
0,99999999999999988897769753748434595763683319091796875
+1 per il più grande possibile galleggiante! –
Se il codice C sopra riportato è compilato con -fsingle-precision-constant, questo potrebbe restituire 1.0. Vedi la mia risposta per i dettagli –
Dal codice a risposte di antimonio è facile vedere che random.Random() non restituisce esattamente 1.0 su piattaforme che hanno almeno 53 bit mantissa per i calcoli coinvolgendo costanti non annotate con 'f' in C. Questa è la precisione che IEEE 754 prescrive ed è standard oggi.
Tuttavia, su piattaforme con minore precisione, ad esempio se Python è compilato con -fsingle-precision-constant per l'uso su una piattaforma incorporata, l'aggiunta di b a * 67108864.0 può comportare un arrotondamento fino a 2^53 se b è abbastanza vicino a 2^26 e questo vorrebbe dire che 1.0 viene restituito. Nota che questo succede indipendentemente dalla precisione con cui usa la funzione PyFloat_FromDouble.
Un modo per testare questo sarebbe di controllare qualche centinaio di numeri casuali se il 53 ° bit è sempre 1. Se è 1 almeno una volta questo dimostra una precisione sufficiente e stai bene. In caso contrario, l'arrotondamento è la spiegazione più probabile che significa che random.random() può restituire 1.0. Ovviamente è possibile che tu sia stato solo sfortunato. Puoi spingere la certezza quanto vuoi testando più numeri.
- 1. Intervallo doppio intervallo tempo standard
- 2. Codice malevolo dalla libreria standard Python
- 3. Come ereditare Scaladoc dalla libreria standard di Scala?
- 4. mod_wsgi python non può importare dalla libreria standard
- 5. Libreria standard .NET rispetto allo standard .NET
- 6. La libreria standard Python è veramente standard?
- 7. Etichette libreria standard
- 8. Matrix Libreria standard
- 9. Libreria standard Intel (C++)
- 10. libreria standard `tipo file`
- 11. Libreria intervallo selezione cross-browser?
- 12. Un'implementazione di libreria standard può specializzare i tipi standard?
- 13. Libreria standard matura per C
- 14. Embed python3 senza libreria standard
- 15. versioni della libreria standard C++
- 16. Include la libreria standard C++
- 17. Qual è la differenza tra la libreria standard e la libreria di modelli standard?
- 18. utilizzati in STL (libreria di modelli standard)
- 19. Libreria di strutture dati standard in C?
- 20. PEP 257 assestamento docstring nella libreria standard?
- 21. Aggiunta di un attributo a un dizionario python dalla libreria standard
- 22. RICERCA PRIMA/DOPO con Pythons imaplib
- 23. Intestazione intervallo mancante dalla richiesta video?
- 24. Differenza tra libreria standard C e libreria POSIX
- 25. Pythons modo più veloce di caso casualità di una stringa
- 26. Intervallo di indirizzi di una libreria caricata dinamicamente in Windows
- 27. Una buona libreria di aritmetica (intervallo) di incertezza?
- 28. Diagnosi EXC_BAD_INSTRUCTION nella libreria standard Swift
- 29. Metodi free-side nella libreria standard Java
- 30. boost :: alternativa opzionale nella libreria standard C++
C'è oro in queste colline. 42 punti (e conteggio) per una domanda su cosa restituisce random.random(). –
telliott99
Avviso se non si termina la sequenza 0.9999 è effettivamente uguale a 1.0. –