W jaki sposób można wygenerować losowe liczb całkowitych między dwoma określonymi zmiennych w JavaScript, np x = 4
i y = 8
będzie wyjście któregokolwiek 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
źródło
źródło
Odpowiedzi:
Istnieje kilka przykładów na stronie Mozilla Developer Network :
Oto logika. To prosta zasada trzech:
Math.random()
zwracaNumber
od 0 (włącznie) do 1 (wyłącznie). Mamy więc taki interwał:Chcielibyśmy teraz liczbę pomiędzy
min
(włącznie) amax
(wyłącznie):Możemy użyć,
Math.random
aby uzyskać korespondenta w przedziale [min, maks.). Ale najpierw powinniśmy wziąć pod uwagę problem, odejmującmin
od drugiego przedziału:To daje:
Możemy teraz złożyć wniosek,
Math.random
a następnie obliczyć korespondenta. Wybierzmy liczbę losową:Aby znaleźć
x
, zrobilibyśmy:Nie zapomnij dodać z
min
powrotem, aby uzyskać liczbę w przedziale [min, maks.):To była pierwsza funkcja z MDN. Drugi zwraca liczbę całkowitą pomiędzy
min
imax
, oba włącznie.Teraz do uzyskania liczby całkowite, można użyć
round
,ceil
lubfloor
.Możesz użyć
Math.round(Math.random() * (max - min)) + min
, ale daje to nierównomierną dystrybucję. Zarówno,min
amax
tylko około połowę szansę na rolce:Po
max
wykluczeniu z przedziału ma jeszcze mniejszą szansę na wyrzucenie niżmin
.Dzięki temu
Math.floor(Math.random() * (max - min +1)) + min
masz idealnie równomierną dystrybucję.Nie można używać
ceil()
i-1
w tym równaniu, bomax
teraz miał nieco mniejsze szanse na rolki, ale można przechylać (niechciane)min-1
skutkować zbyt.źródło
floor
, co zaokrągla w dół.round
, ale obamin
imax
tylko połowa szans na rzucenie , tak jak inne liczby. Możesz też odjąć jedną i wziąćceil
. To jednak pozostawiamax
liczbę z minimalną mniejszą szansą na wyrzucenie ze względu na[0,1)
Interwał.źródło
(Math.random() * (maximum - minimum + 1) ) << 0
jest szybsze.x << 0
,x | 0
,~~x
) zamiastMath.floor()
nawróconychx
w dwóch uzupełnienie ze znacznie mniejszym zakresie niżNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), więc trzeba go używać z rozwagą!657348096152|0
otrzymasz 218099864 (1100111111111111000010011000 w formacie binarnym).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
stosowanie:
awaria:
Zwracamy funkcję (zapożyczanie z programowania funkcjonalnego), która po wywołaniu zwróci losową liczbę całkowitą między wartościami
bottom
itop
włącznie. Mówimy „włącznie”, ponieważ chcemy uwzględnić zarówno dolną, jak i górną część zakresu liczb, które można zwrócić. Tą drogą,getRandomizer( 1, 6 )
zwróci 1, 2, 3, 4, 5 lub 6.(dół to niższa liczba, góra to większa liczba)
Math.random()
zwraca losowy podwójny od 0 do 1, a jeśli pomnożymy go przez jeden plus różnica międzytop
ibottom
, otrzymamy podwójną wartość pomiędzy0
a1+b-a
.Math.floor
zaokrągla liczbę w dół do najbliższej liczby całkowitej. Mamy teraz wszystkie liczby całkowite między0
itop-bottom
. 1 wygląda na mylące, ale musi tam być, ponieważ zawsze zaokrąglamy w dół, więc bez tego nigdy nie zostanie osiągnięta najwyższa liczba. Losowe dziesiętne generujemy musi mieścić się w przedziale0
do(1+top-bottom)
tak możemy zaokrąglić w dół i uzyskać int w przedziale0
dotop-bottom
Kod w poprzednim przykładzie dał nam liczbę całkowitą w zakresie
0
itop-bottom
tak wszyscy musimy teraz zrobić, to dodaćbottom
do tego wyniku, aby uzyskać całkowitą w zakresiebottom
itop
włącznie. :REUWAGA: Jeśli wpiszesz najpierw wartość niecałkowitą lub większą liczbę, otrzymasz niepożądane zachowanie, ale chyba że ktoś o to poprosi, nie będę zagłębiał się w kod sprawdzania argumentów, ponieważ jest to raczej dalekie od intencji pierwotnego pytania .
źródło
Alternatywnie, jeśli używasz Underscore.js , możesz użyć
źródło
_.uniqueId()
funkcję, którą można wywołać dla modeli po stronie klienta.x << 0
,x | 0
,~~x
) zamiastMath.floor()
nawróconychx
w dwóch uzupełnienie ze znacznie mniejszym zakresie niżNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), więc trzeba go używać z rozwagą!Zwróć losową liczbę od 1 do 10:
Zwróć losową liczbę od 1 do 100:
źródło
Jeśli potrzebujesz zmiennej między 0 a maksimum, możesz użyć:
źródło
Pozostałe odpowiedzi nie uwzględniają idealnie rozsądnych parametrów
0
i1
. Zamiast tego należy używaćround
zamiast zceil
lubfloor
:źródło
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
Czy 9 i 7 występują między 5 a 6? ...... powinieneś to poprawić lub wyjaśnić ...Oto implementacja MS DotNet klasy Random w javascript-
Posługiwać się:
źródło
Użyj tej funkcji, aby uzyskać losowe liczby między podanym zakresem
źródło
Po wygenerowaniu liczby losowej za pomocą programu komputerowego nadal jest uważana za liczbę losową, jeśli wybrana liczba jest częścią lub pełną liczbą początkową. Ale jeśli to się zmieniło, wówczas matematycy nie przyjmą go jako liczby losowej i mogą nazwać to liczbą stronniczą. Ale jeśli opracowujesz program do prostego zadania, nie będzie to do rozważenia. Ale jeśli opracowujesz program do generowania losowej liczby dla wartościowych rzeczy, takich jak program loteryjny lub gra hazardowa, wówczas Twój program zostanie odrzucony przez kierownictwo, jeśli nie będziesz rozważał powyższego przypadku.
Oto propozycja dla tych ludzi:
Wygeneruj liczbę losową za pomocą
Math.random()
. (Powiedz ton
)Jeśli wiesz, jak odczytać tabelę liczb losowych, aby wybrać liczbę losową, wiesz, że powyższy proces (pomnożenie przez 1, 10, 100 itd.) Nie narusza tego, o którym mówiłem na początku (ponieważ zmienia tylko miejsce przecinka dziesiętnego).
Przestudiuj poniższy przykład i opracuj go według własnych potrzeb.
Jeśli potrzebujesz próbki [0,9], to odpowiedź n * 10 jest odpowiedzią, a jeśli potrzebujesz [0,99], to odpowiedź n * 100 jest odpowiedzią i tak dalej.
Teraz wejdź w swoją rolę:
Poprosiłeś liczby z określonego zakresu. (W tym przypadku jesteś stronniczy w tym zakresie. - Biorąc liczbę z [1,6] rzucając kością, to jesteś stronniczy w [1,6], ale nadal jest losowy, jeśli i tylko jeśli kość jest bezstronna .)
Rozważ więc swój zakres ==> [78, 247] liczba elementów zakresu = 247 - 78 + 1 = 170; (ponieważ obie granice są włącznie.
Uwaga: W metodzie pierwszej najpierw stworzyłem tablicę zawierającą potrzebne liczby, a następnie losowo umieściłem je w innej tablicy. W metodzie drugiej generuj liczby losowo i sprawdź, czy mieszczą się w wymaganym zakresie. Następnie umieść go w tablicy. Tutaj wygenerowałem dwie liczby losowe i wykorzystałem je wszystkie, aby zmaksymalizować szybkość programu poprzez zminimalizowanie wskaźnika awaryjności w celu uzyskania użytecznej liczby. Jednak dodanie wygenerowanych liczb da również trochę stronniczości. Poleciłbym więc moją pierwszą metodę generowania liczb losowych w określonym zakresie.
W obu metodach konsola wyświetli wynik (naciśnij klawisz F12 w Chrome, aby otworzyć konsolę)
źródło
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] Liczby 1 i 6 z konieczności będą walcowane mniej niż 2, 3, 4 i 5. Różnica jest jednak w zasadzie nieistotna.Aby uzyskać losową liczbę całkowitą z zakresem, spróbuj:
źródło
Aby przetestować tę funkcję i jej odmiany, zapisz poniższy kod HTML / JavaScript w pliku i otwórz w przeglądarce. Kod wygeneruje wykres pokazujący rozkład miliona wywołań funkcji. Kod zapisuje również przypadki na krawędziach, więc jeśli funkcja wygeneruje wartość większą niż maksimum lub mniejszą niż min, będziesz wiedział.
źródło
Aby uzyskać liczbę losową, powiedzmy między 1 a 6, najpierw:
To mnoży liczbę losową przez 6, a następnie dodaje do niej 0,5. Następnie zaokrąglij liczbę do dodatniej liczby całkowitej, wykonując:
Zaokrągla liczbę do najbliższej liczby całkowitej.
Aby uczynić to bardziej zrozumiałym, wykonaj następujące czynności:
Zasadniczo kod do wykonania tego przy użyciu zmiennych to:
Powodem odebrania 0,5 wartości minimalnej jest to, że samo użycie wartości minimalnej pozwoliłoby uzyskać liczbę całkowitą, która była o jeden większa od wartości maksymalnej. Odejmując 0,5 od wartości minimalnej, zasadniczo zapobiegasz zaokrąglaniu wartości maksymalnej.
Mam nadzieję, że to pomaga.
źródło
Za pomocą następującego kodu możesz wygenerować tablicę liczb losowych, bez powtarzania, w danym zakresie.
źródło
Wiem, że na to pytanie już udzielono odpowiedzi, ale moja odpowiedź może komuś pomóc.
Znalazłem tę prostą metodę na W3Schools:
Mam nadzieję, że to komuś pomoże.
źródło
Losowa liczba całkowita od najniższej do najwyższej:
Nie jest to najbardziej eleganckie rozwiązanie ... ale coś szybkiego.
źródło
Oto, czego używam do generowania liczb losowych.
Wykonujemy,
high++
ponieważMath.random()
generuje losową liczbę od 0 (włącznie) i 1 (wyłącznie) Ta wykluczona oznacza, że musimy zwiększyć najwyższą wartość o jeden przed wykonaniem jakiejkolwiek matematyki. Następnie odejmujemy niski od wysokiego, dając nam najwyższą liczbę do wygenerowania - niską, a następnie + niską, przywracając wysoką wartość z powrotem do normalnej, a najniższą liczbę co najmniej najniższą. następnie zwracamy wynikową liczbęrandom(7,3)
może wrócić3,4,5,6, or 7
źródło
high
jest używany tylko raz, równie dobrze możesz użyćhigh-low+1
zamiast osobnej instrukcji przyrostu. Ponadto większość użytkowników spodziewałaby się, żelow
parametr będzie na pierwszym miejscu.Uint8Array tworzy tablicę wypełnioną liczbą do 3 cyfr, która może wynosić maksymalnie 999. Ten kod jest bardzo krótki.
źródło
Oto przykład funkcji javascript, która może generować losową liczbę o dowolnej określonej długości bez użycia Math.random ():
źródło
to jest moje zdanie na temat liczby losowej w zakresie, ponieważ chciałem uzyskać liczbę losową w zakresie od podstawy do wykładnika. np. podstawa = 10, wykładnik = 2, daje liczbę losową od 0 do 100, idealnie itd.
jeśli to pomaga w użyciu, oto:
ź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
Krypto-silny
Aby uzyskać krypto-silną losową liczbę całkowitą w ragne [x, y] spróbuj
źródło
Możesz zrobić ten fragment kodu,
źródło
do - while
zamiastwhile
Ionuț G. Stan napisał świetną odpowiedź, ale było to dla mnie zbyt skomplikowane. Znalazłem więc jeszcze prostsze wyjaśnienie tych samych pojęć na https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation przez Jasona Anello.
UWAGA: Jedyną ważną rzeczą, którą powinieneś wiedzieć przed przeczytaniem wyjaśnień Jasona, jest definicja „obcięcia”. Używa tego terminu przy opisywaniu
Math.floor()
. Słownik Oxford definiuje „obcinać” jako:źródło
Może to obsłużyć generowanie do 20 cyfr niepowtarzalnej liczby losowej
JS
JsFiddle
źródło
/ * Napisz wywoływaną funkcję,
randUpTo
która akceptuje liczbę i zwraca losową liczbę całkowitą od 0 do tej liczby? * // * Napisz nazwaną funkcję,
randBetween
która akceptuje dwie liczby reprezentujące zakres i zwraca losową liczbę całkowitą między tymi dwiema liczbami. * // * Napisz wywoływaną funkcję,
randFromTill
która akceptuje dwie liczby reprezentujące zakres i zwraca liczbę losową między min (włącznie) i max (wyłącznie). * // * Napisz wywoływaną funkcję,
randFromTo
która akceptuje dwie liczby reprezentujące zakres i zwraca losową liczbę całkowitą między min (włącznie) i max (włącznie) * /źródło
Zrobiłem tę funkcję, która bierze pod uwagę opcje takie jak min, max, exclude (lista ints do wykluczenia) i seed (na wypadek, gdybyś chciał rozstawionego generatora losowego).
Może być używany jak:
Lub prościej:
Następnie możesz zrobić:
Gist: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
źródło
Math.floor zaokrągla liczbę w dół do najbliższej liczby całkowitej
Aby więc wygenerować losową liczbę całkowitą od 4 do 8 włącznie, wywołaj powyższą funkcję z następującymi argumentami:
źródło
Moja metoda generowania liczb losowych od 0 do n, gdzie n <= 10 (n wykluczone):
źródło