Inizierò definendo le prossime due funzioni di supporto e quindi le useremo per ottenere i valori. Questi metodi sono le tue definizioni dei casi B.
int nextInt(int min, int max) {
return Math.floor(Math.random() * (max - min)) + min;
}
float nextFloat(float min, float max) {
return Math.random() * (max - min) + min;
}
Poi per interi
- A: tornare nextInt (min + 1, max);
- B: return nextInt (min, max);
- C: return nextInt (min + 1, max + 1);
- D: return nextInt (min, max + 1);
I galleggianti sono un caso un po 'più complesso. Qualcuno potrebbe obiettare che non c'è molta differenza se gli end point sono inclusi o meno - specialmente una soluzione aperta può essere usata al posto di chiusa - dal momento che i punti finali vengono selezionati raramente. Ma dal momento che è perfettamente possibile implementare tutti gli scenari, penso che ci sia un interesse matematico su come può essere fatto.
A: In questo caso semplice possiamo fare in modo che il valore di illegale è rotolato ancora:
float f;
do {
f = nextFloat(min, max);
} while (f == min);
return f;
B:
return nextFloat(min, max);
C: Qui abbiamo appena passare the endpoint
float f = nextFloat(min, max);
if (f == min) {
return max;
}
return f;
D: Questo è il più complesso scenario di tutto, ma può essere realizzato come segue:
float f = nextFloat(min, max);
if (f == min) {
return max;
}
return nextFloat(min, max);
I casi A e D sono un po 'sporca nel senso che possono richiedere la generazione più numero casuale, che potrebbe essere un problema in alcuni scenari specifici. Risolvere ciò richiederebbe di scavare in profondità nelle specifiche del punto mobile per trovare implementazioni alternative. Inoltre si dovrebbe notare che nel caso D la propensione del valore massimo ha una propensione leggermente superiore rispetto a qualsiasi altro numero, se la funzione di riferimento è completamente uniforme (di solito non), ma di solito questa è solo una questione teorica. (Per essere precisi, se ci sono n valori possibili all'interno dell'intervallo, la propensione del valore massimo pmax = 1/(n-1) e la propabilità di qualsiasi altro valore è (1-pmax)/(n-1)).
Un piccolo problema che dovrebbe essere curato in implementazioni precise del caso A in virgola mobile, dovrebbe essere notato. Esiste la possibilità che il chiamante della funzione lo chiamerà con punti mobili adiacenti. Questo non è facile da vedere con un controllo fittizio dei parametri, quindi per essere sicuri ci dovrebbe essere un limite su quante volte il ciclo può essere eseguito.
il mio riferimento proviene da [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) – tgogos
I sta corretti –
Il 'float B' caso non funziona: in molti casi, quella formula sarà in grado di generare il limite superiore e il limite inferiore. –