Czy istnieje sposób na wygenerowanie liczby losowej w określonym zakresie (np. Od 1 do 6: 1, 2, 3, 4, 5 lub 6) w JavaScript?
javascript
random
Mirgorod
źródło
źródło
Math.floor((Math.random()*10)+1);
nie może dla Ciebie działać, jak określono tutaj na w3schools.com/jsref/jsref_random.asp ..?Odpowiedzi:
Ważny
Poniższy kod działa tylko wtedy, gdy minimalna wartość to
1
. Nie działa dla wartości minimalnych innych niż1
.Jeśli chcesz uzyskać losową liczbę całkowitą od 1 ( i tylko 1 ) do 6, obliczysz:
Gdzie:
źródło
Math.floor(Math.random() * 6) + 2
oznacza to, że jeśliMath.random()
wyniki w 0.99, nasza losowa wartość będzie7
To, co robi „dodatkowe”, to pozwala na losowe interwały, które nie zaczynają się od 1. W ten sposób można na przykład uzyskać losową liczbę od 10 do 15. Elastyczność.
źródło
to
argumentu,from
argument podwaja się jako maksimumReturns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )Math.random ()
Zwraca całkowitą liczbę losową między min (w zestawie ) i max (w zestawie ):
Lub dowolna liczba losowa od min (w zestawie ) do maks. ( Nie w zestawie ):
Przydatne przykłady (liczby całkowite):
** I zawsze miło przypomnieć (Mozilla):
źródło
[1,2]
, istnieje 25% szansyMath.random()
nie daje liczbę od jednego z nich[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Zaokrąglenie tych przedziałów spowodowałoby 0, 1, 1, 2, co nie jest równomiernym rozkładem.Math.round
nadmierne używanieMath.floor
daje różne wyniki.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Inne rozwiązania:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Wypróbuj online
źródło
~~a
i bitowe OR (a | 0) są szybszymi sposobami pisania Math.floor (a)a | 0
jest także najszybszym i najbardziej zoptymalizowanym sposobem konwersji łańcucha na liczbę całkowitą. Działa tylko z łańcuchami zawierającymi liczby całkowite ("444"
i"-444"
), tj. Bez pływaków / ułamków. Daje a0
za wszystko, co zawiedzie. Jest to jedna z głównych optymalizacji asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
iMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Aby uzyskać liczbę losową
generateRandomInteger(-20, 20);
WYJAŚNIENIE PONIŻEJ
Musimy uzyskać losową liczbę całkowitą, powiedzmy X między min a max.
Dobrze?
tj. min <= X <= maks
Jeśli odejmiemy min od równania, jest to równoważne z
0 <= (X - min) <= (maks. - min)
Teraz pomnóżmy to przez losową liczbę r, która jest
0 <= (X - min) * r <= (max - min) * r
Teraz dodajmy z powrotem min do równania
min <= min + (X - min) * r <= min + (max - min) * r
Teraz, pozwala wybrał funkcję, która powoduje R w taki sposób, że spełnia równanie jako zakres naszego [min, X, max]. Jest to możliwe tylko wtedy, gdy 0 <= r <= 1
OK. Teraz zakres r ie [0,1] jest bardzo podobny do wyniku funkcji Math.random (). Czyż nie
Na przykład,
Przypadek r = 0
min
+ 0 * (max
-min
) = minPrzypadek r = 1
min
+ 1 * (max
-min
) = maksPrzypadek losowy przy użyciu Math.random 0 <= r <1
min
+ r * (max
-min
) = X , gdzie X ma zakres min <= X < maksPowyższy wynik X jest losową liczbą. Jednak ze względu na Math.random () nasza lewa granica jest włączająca, a prawa granica jest wyłączna. Aby uwzględnić naszą prawą granicę, zwiększamy prawą granicę o 1 i podnosimy wynik.
Aby uzyskać liczbę losową
generateRandomInteger(-20, 20)
;źródło
Lub w podkreśleniu
źródło
źródło
jsfiddle: https://jsfiddle.net/cyGwf/477/
Random Integer : aby uzyskać losową liczbę całkowitą pomiędzy
min
imax
, użyj następującego koduLosowy numer zmiennoprzecinkowy : aby uzyskać losową liczbę zmiennoprzecinkową między
min
imax
, użyj następującego koduOdniesienie: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
źródło
Matematyka nie jest moją mocną stroną, ale pracowałem nad projektem, w którym musiałem wygenerować wiele liczb losowych między zarówno dodatnimi, jak i ujemnymi.
Na przykład
Oczywiście możesz także dodać sprawdzanie poprawności, aby upewnić się, że nie robisz tego z niczym innym niż liczbami. Upewnij się również, że min jest zawsze mniejsze lub równe max.
źródło
min + Math.random() * max
da ci liczby od min do min + max, co nie jest tym, czego chcesz. Pierwsza gałąź tejif
jest poprawna, ale można ją uprościć, mówiącreturn min + Math.random() * (max - min)
, która jest poprawnym rozwiązaniem niezależnie od tego, czy min jest dodatnia czy ujemna (patrz pozostałe odpowiedzi). Pamiętaj też, że jeśli nie chcesz ułamków, nadal musisz obniżyć wynik.Napisałem bardziej elastyczną funkcję, która może dać ci liczbę losową, ale nie tylko liczbę całkowitą.
Naprawiona wersja.
źródło
Przykład
Zwróć losową liczbę od 1 do 10:
Wynik może być:
3
Spróbuj sam: tutaj
-
lub używając lodash / undescore:
_.random(min, max)
Dokumenty: - lodash - undescore
źródło
Pomimo wielu odpowiedzi i prawie tego samego rezultatu. Chciałbym dodać swoją odpowiedź i wyjaśnić jej działanie. Ponieważ ważne jest, aby zrozumieć jego działanie, a nie kopiować wklejanie kodu jednego wiersza. Generowanie liczb losowych to nic innego jak prosta matematyka.
KOD:
źródło
Szukałem generatora liczb losowych napisanego w TypeScript i napisałem to po przeczytaniu wszystkich odpowiedzi, mam nadzieję, że zadziała dla koderów TypeScript.
źródło
Math.random()
jest szybki i odpowiedni do wielu celów, ale nie jest odpowiedni, jeśli potrzebujesz bezpiecznych kryptograficznie wartości (nie jest bezpieczny) lub jeśli potrzebujesz liczb całkowitych z całkowicie jednorodnego rozkładu bezstronnego (metoda mnożenia stosowana w innych odpowiedziach nieco częściej wytwarza określone wartości niż inni).W takich przypadkach możemy użyć
crypto.getRandomValues()
do wygenerowania bezpiecznych liczb całkowitych i odrzucić wszelkie wygenerowane wartości, których nie możemy jednolicie odwzorować w zakresie docelowym. Będzie to wolniejsze, ale nie powinno być znaczące, chyba że generujesz wyjątkowo dużą liczbę wartości.Aby wyjaśnić problem z tendencyjnym rozkładem, rozważ przypadek, w którym chcemy wygenerować wartość między 1 a 5, ale mamy generator liczb losowych, który wytwarza wartości między 1 a 16 (wartość 4-bitowa). Chcemy, aby ta sama liczba wygenerowanych wartości została odwzorowana na każdą wartość wyjściową, ale 16 nie dzieli się równomiernie przez 5: pozostawia pozostałą część 1. Musimy więc odrzucić 1 z możliwych wygenerowanych wartości i kontynuować tylko, gdy otrzymamy jedna z 15 mniejszych wartości, które mogą być jednolicie odwzorowane w naszym zakresie docelowym. Nasze zachowanie może wyglądać następująco:
Poniższy kod wykorzystuje podobną logikę, ale generuje 32-bitową liczbę całkowitą, ponieważ jest to największy wspólny rozmiar liczby całkowitej, który może być reprezentowany przez standardowy
number
typ JavaScript . (Można to zmienić, aby użyćBigInt
s, jeśli potrzebujesz większego zakresu.) Niezależnie od wybranego zakresu, część wygenerowanych wartości, które są odrzucane, zawsze będzie mniejsza niż 0,5, więc oczekiwana liczba odrzuceń będzie zawsze mniejsza niż 1,0 i zwykle blisko 0,0; nie musisz się martwić, że zapętli się na zawsze.źródło
Dodawanie
float
ze stałą precyzją w oparciu oint
wersję z odpowiedzi @ Francisc:więc:
i dla int odpowiedzi
źródło
Krypto-silna losowa liczba całkowita z zakresu [a, b] (założenie: a <b)
źródło
To powinno działać:
źródło
Odkryłem świetny nowy sposób na wykonanie tego przy użyciu domyślnych parametrów ES6. Jest bardzo fajny, ponieważ pozwala na jeden argument lub dwa argumenty. Oto on:
źródło
Spóźnia się to około dziewięciu lat, ale randojs.com sprawia, że jest to prosta liniówka :
Musisz tylko dodać to do nagłówka dokumentu HTML, a możesz z łatwością robić dowolne rzeczy z przypadkiem. Losowe wartości z tablic, losowe elementy jquery, losowe właściwości z obiektów, a nawet zapobieganie powtórzeniom w razie potrzeby.
źródło
Działa to dla mnie i generuje wartości takie jak standardowa funkcja biblioteki random.randint w Pythonie :
źródło
Spróbuj użyć:
źródło
zwracać 1-6 jak kostka w zasadzie,
źródło