2011-10-16 7 views
8

La documentazione per scala.util.Random.nextInt (n: Int): Int dice "Restituisce un valore int pseudocasuale, uniformemente distribuito tra 0 (incluso) e il valore specificato (esclusivo) ..." mentre per scala.util.Random.nextInt(): Int dice "Restituisce il valore int successivo pseudocasuale, uniformemente distribuito ..." senza ssare nulla sullo zero. Posso ottenere un valore negativo qui occasionalmente?Can scala.util.Random.nextInt(): Int occasionalmente restituisce un valore negativo?

+0

Dove dice questo? I documenti che ho trovato dicevano "Tutti i 2^32 possibili valori int sono prodotti con (approssimativamente) probabilità uguale", il che significa che i numeri negativi sono * più * probabili rispetto a quelli positivi (poiché c'è un altro numero negativo). – Malvolio

risposta

9

A quanto pare, sì. Al mio primo tentativo ha restituito un valore negativo! :-)

scala> import util.Random 
import util.Random 

scala> Random.nextInt 
res0: Int = -299006430 
+0

quali sono le probabilità ?! :) –

+0

@FabienWarniez, quali sono le probabilità che lei commenta questo sul mio post antico ieri, e io che mi imbatto in una situazione simile all'incirca nello stesso periodo? :) https://twitter.com/missingfaktor/status/914642815854006272 – missingfaktor

+0

Sono un po 'spaventato TBH! – missingfaktor

12

Sì, è possibile (e ciò è corretto a causa di definition di distribuzione uniforme). Inoltre lo riceverai in quasi il 50% dei casi.

(for(i <- 1 to 100000) yield scala.util.Random.nextInt()).filter(_<0).length 

hanno ceduto per me 49946 - che è abbastanza vicino al 50%.

+0

In media, infatti, * esattamente * 50% dei casi –

+1

@Luigi Non dimenticare i casi neutrali, quando il valore casuale è uguale a 0. Quindi ci sono 49,9 ...% percentuali di positivo, il stesso numero di negativi e pochi zeri. –

+0

Non ho dimenticato ... beh, suppongo che qualsiasi valore sia altrettanto probabile. Forse non puoi ottenere Int.MinValue o qualcosa del genere. Ci sono 2147483648 negativi, 2147483647 positivi e 1 zero Int –

2

scala.uti.Random.nextInt(): Int sfrutta lo stesso metodo di java.util.Random. E l'intervallo indicato da Luigi è [Integer.MIN_VAL, Integer.MAX_VAL]. In realtà "valore int uniformemente distribuito" significa che è possibile restituire qualsiasi numero di tipo int e la possibilità di ciascuno in teoria di essere la stessa.

7

Come si può vedere here (usando eccellente sxr di Mike Harrah), Random solo i delegati di Scala a un java.util.Random sottostante, che viene indicato come self.

Come altri hanno sottolineato, l'intervallo predefinito è compreso tra Integer.MIN_VAL e Integer.MAX_VAL, in altre parole, qualsiasi Integer possibile, compresi quelli negativi.

Se si desidera solo il campo positivo, è possibile utilizzare il metodo di overload nextInt che prende un argomento, come questo:

Random.nextInt(Integer.MAX_VALUE); 

Secondo la documentazione:

Restituisce un pseudocasuale, uniformemente valore int distribuito tra 0 (incluso) e il valore specificato (esclusivo), tratto da questa sequenza del generatore di numeri casuali .

Problemi correlati