2010-02-01 23 views

risposta

19

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.

+8

Per una spiegazione della notazione intervallo parentesi/parent, guarda qui: http: //en.wikipedia. org/wiki/Interval_ (matematica) #Terminology –

+1

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

+0

È molto meglio collegarsi alla vera documentazione quando scrivi su una pagina web. –

10

La funzione di Python random.random restituisce numeri inferiori a, ma non uguali a, 1.

Tuttavia, è possibile restituire 0.

+1

random() -> x nell'intervallo [0, 1) Cioè, incluso 0. – telliott99

+4

@ telliott99: Questo è (quasi) esattamente ciò che ho detto. – SLaks

+1

+1 per essere l'unica risposta a non fare affidamento sulla notazione matematica sci-fi! –

32
>>> help(random.random) 
Help on built-in function random: 

random(...) 
    random() -> x in the interval [0, 1). 

Ciò significa che 1 è escluso.

+9

Mi piace la tua risposta migliore. Python ha un fantastico sistema di aiuto interno e le persone dovrebbero essere incoraggiate a usarlo. – Omnifarious

11

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

+1 per il più grande possibile galleggiante! –

+1

Se il codice C sopra riportato è compilato con -fsingle-precision-constant, questo potrebbe restituire 1.0. Vedi la mia risposta per i dettagli –

2

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.

Problemi correlati