Zacznę od zdefiniowania następnych dwóch funkcji pomocnika, a następnie skorzystam z nich, aby uzyskać wartości. Te metody są twoimi definicjami przypadków 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;
}
Następnie przez całkowite
- A: powrotu nextInt (min + 1, max);
- B: return nextInt (min, max);
- C: return nextInt (min + 1, maks. + 1);
- D: return nextInt (min, max + 1);
Pływaki są nieco bardziej złożone. Niektórzy mogą twierdzić, że nie ma dużej różnicy, czy punkty końcowe są uwzględnione, czy nie - szczególnie rozwiązanie otwarte może być używane zamiast zamkniętego - ponieważ punkty końcowe są rzadko wybierane. Ale ponieważ jest to całkowicie możliwe, aby zrealizować wszystkie scenariusze, myślę, że istnieje matematyczne zainteresowanie, w jaki sposób można to zrobić.
A: W tym przypadku możemy prosty upewnić się, że nielegalne wartość zostanie wyrzucona ponownie:
float f;
do {
f = nextFloat(min, max);
} while (f == min);
return f;
B:
return nextFloat(min, max);
C: Tu wystarczy przełączyć punkt końcowy
float f = nextFloat(min, max);
if (f == min) {
return max;
}
return f;
D: Jest to najbardziej skomplikowany scenariusz wszystkim, ale można osiągnąć w następujący sposób:
float f = nextFloat(min, max);
if (f == min) {
return max;
}
return nextFloat(min, max);
przypadków A i D są trochę brudne w tym sensie, że mogą one wymagać generowania więcej niż jeden losowa liczba, która może być problemem w niektórych konkretnych sytuacjach. Rozwiązanie tego problemu wymagałoby wniknięcia w specyfikację zmiennoprzecinkowej w celu znalezienia alternatywnych implementacji. Ponadto należy zauważyć, że w przypadku D, propozycja wartości maksymalnej ma bardzo nieznacznie większą zdolność niż jakakolwiek inna liczba, jeśli funkcja odniesienia jest całkowicie jednorodna (zwykle nie), ale zazwyczaj jest to tylko kwestia teoretyczna. (Aby być precyzyjnym, jeśli istnieje n możliwych wartości w zakresie, propability maksymalnej wartości pmax = 1/(n-1) i propability dowolnej innej wartości jest (1-pmax)/(n-1)).
Należy zwrócić uwagę na mały problem, który należy rozwiązać przy precyzyjnych implementacjach przypadku zmiennoprzecinkowego A. Istnieje możliwość, że wywołujący funkcję wywoła go z sąsiednimi punktami zmiennoprzecinkowymi. Nie jest to łatwe do sprawdzenia przez jakąkolwiek próbną kontrolę parametrów, więc aby być pewnym, powinien istnieć limit określający ile razy pętla może zostać wykonana.
mój odniesienia jest od [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) – tgogos
stoję poprawione –
Twój 'unosić B' Sprawa nie działa: w wielu przypadkach formuła ta będzie w stanie wygenerować zarówno górną, jak i dolną granicę. –