Limite superiore esclusivo o esclusivo in generatori di numeri pseudo casuali

2

Sto creando una piccola libreria di randomizzazione. Uno dei metodi è simile a System.Random.Next(int start, int end) di .NET. Il fatto è che non sono sicuro di come decidere se il limite superiore debba essere inclusivo o esclusivo. Mentre Random.Next di .NET ha un limite superiore esclusivo, ci sono altri framework e librerie che funzionano con bound incluso.

Prima di tutto c'è una domanda sul perché alcuni produttori di biblioteche scelgono il limite superiore per essere esclusivi. IMO, dal punto di vista dell'utente della libreria, non è piacevole.

Ad esempio, lanciare un dado d6 ha il seguente aspetto:

var dieResult = rand.Next(1, 7);

Il secondo argomento suggerisce che 7 sia un risultato valido, o che voglio un numero casuale dall'intervallo di 7 numeri consecutivi a partire dal numero 1. Nessuno dei quali è vero. Non riesco a vedere come la scelta di un limite superiore esclusivo abbia senso.

Inoltre, essendo esclusivo, il limite superiore impedisce a un PRNG di scegliere Int32.MaxValue che è un'altra cosa strana.

Quindi, per riassumere:

  • C'è una spiegazione sul motivo per cui gli sviluppatori .NET hanno scelto il limite superiore come esclusivo
posta Kornelije Petak 10.09.2015 - 05:51
fonte

1 risposta

1

La risposta semplice, un po 'umoristica e non del tutto probabile: hanno copiato Java .

public int nextInt(int n)

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. ...

Più probabilmente, risale a C e al suo random () che genera da 0 a INT_MAX. Per rientrare nell'intervallo desiderato, in genere esegui (rand() % range) + 1 . Quindi, se vuoi un d6, devi fare dieResult = (rand() % 6) + 1 . Notare la gamma 'esclusiva' lì. Si noti inoltre che questo è un generatore di numeri casuali molto scarso a causa della sua distribuzione non uniforme.

La scelta di inclusiva o esclusiva è una discussione, e si possono trovare le ragioni per entrambe le parti. E qualcuno sta per essere infelice e qualcuno sta per ottenere un errore di un errore con qualsiasi scelta fatto.

L'esclusivo valore elevato rende molto più facile lavorare con indici basati su zero come il codice fornito nei documenti :

  int mIndex = rnd.Next(0, malePetNames.Length);
  int fIndex = rnd.Next(0, femalePetNames.Length);

Lo ricordo bene in perl nel corso della giornata:

$rnd = $array[rand @array];

Notare l'indicizzazione basata su 0 e l'intervallo superiore esclusivo.

D'altra parte, python utilizza un intervallo inclusivo . std::uniform_int_distribution di C ++ utilizza anche un intervallo per i numeri casuali .

Se era inclusivo, dovresti aggiungere un - 1 a ciascuno di quei valori massimi per selezionare un elemento dall'elenco. D'altra parte una gamma esclusiva, rende i rulli di dadi un aspetto divertente e cercando di ottenere da 0 a Int32.MaxValue un po 'più complicato. Inoltre, fa in modo che alcuni errori di indice fuori dai limiti nei frammenti di codice vadano dall'alto. Scegli tra un errore che farai occasionalmente.

Cercare di fare entrambe le cose rende la biblioteca ingombrante e confusa. Sceglierne uno. Documentalo. Rimanere con esso.

.Net (e Java) probabilmente rimanevano con quello che era più familiare ai suoi utenti da altri linguaggi e probabilmente uno che rendeva l'interfacciamento con le librerie esistenti al momento un po 'più facile.

    
risposta data 21.09.2015 - 05:16
fonte

Leggi altre domande sui tag