Ogólna metoda, która może zwrócić losową liczbę całkowitą między 2 parametrami, tak jak robi to ruby rand(0..n)
.
Jakieś sugestie?
Moją sugestią byłaby funkcja rozszerzająca w IntRange do tworzenia takich losów:(0..10).random()
Od 1.3 Kotlin jest wyposażony we własny wieloplatformowy generator losowy. Jest to opisane w tym ZACHOWAJ . Opisane poniżej rozszerzenie jest teraz częścią standardowej biblioteki Kotlin , po prostu użyj go w następujący sposób:
val rnds = (0..10).random()
Przed 1.3 w JVM używamy Random
lub nawet ThreadLocalRandom
jeśli jesteśmy na JDK> 1.6.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
Używane w ten sposób:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Jeśli chcesz, aby funkcja zwracała tylko 1, 2, ..., 9
( 10
nie uwzględniono), użyj zakresu skonstruowanego za pomocą until
:
(0 until 10).random()
Jeśli pracujesz z JDK> 1.6, użyj ThreadLocalRandom.current()
zamiast Random()
.
KotlinJs i inne odmiany
W przypadku kotlinjs i innych przypadków użycia, które nie pozwalają na użycie java.util.Random
, zobacz tę alternatywę .
Zobacz również tę odpowiedź dla odmian mojej sugestii. Zawiera również funkcję rozszerzenia dla losowych Char
s.
java.util.Random
?Wygeneruj losową liczbę całkowitą z przedziału
from
(włącznie) ito
(wyłącznie)źródło
Int
znaków z zakresu, możesz użyć Random # int (size, from, to) zamiast w java-8 .Od Kotlin 1.2 można napisać:
(1..3).shuffled().last()
Tylko pamiętaj, że to duże O (n), ale dla małej listy (szczególnie unikalnych wartości) jest w porządku: D
źródło
Możesz utworzyć funkcję rozszerzającą podobną do
java.util.Random.nextInt(int)
tej, która przyjmujeIntRange
zamiast anInt
dla swojego powiązania:Możesz teraz użyć tego z dowolną
Random
instancją:Jeśli nie chcesz zarządzać własną
Random
instancją, możesz zdefiniować wygodną metodę, używając na przykładThreadLocalRandom.current()
:Teraz możesz otrzymać losową liczbę całkowitą, tak jak w Rubim, bez konieczności wcześniejszego deklarowania
Random
instancji:źródło
Możliwa odmiana mojej innej odpowiedzi dla losowych znaków
Aby uzyskać losowe wartości
Char
s, możesz zdefiniować taką funkcję rozszerzającąJeśli pracujesz z JDK> 1.6, użyj
ThreadLocalRandom.current()
zamiastRandom()
.W przypadku kotlinjs i innych przypadków użycia, które nie pozwalają na użycie
java.util.Random
, ta odpowiedź pomoże.Kotlin> = 1.3 wsparcie dla wielu platform dla Random
Od 1.3 Kotlin jest wyposażony we własny wieloplatformowy generator losowy. Jest to opisane w tym ZACHOWAJ . Możesz teraz bezpośrednio używać rozszerzenia jako części standardowej biblioteki Kotlin bez definiowania go:
źródło
Opierając się na doskonałej odpowiedzi @ s1m0nw1 , wprowadziłem następujące zmiany.
Kod:
Przypadek testowy:
źródło
Przykłady losowe w zakresie [1, 10]
lub wykorzystując Java Random
źródło
Kotlin> = 1.3, wieloplatformowa obsługa Random
Od wersji 1.3 biblioteka standardowa zapewnia obsługę wielu platform dla losowych danych, zobacz tę odpowiedź.
Kotlin <1.3 w JavaScript
Jeśli pracujesz z Kotlin JavaScript i nie masz do niego dostępu
java.util.Random
, zadziałają:Używane w ten sposób:
źródło
Innym sposobem zaimplementowania odpowiedzi s1m0nw1 byłoby uzyskanie do niej dostępu poprzez zmienną. Nie oznacza to, że jest to bardziej wydajne, ale pozwala uniknąć konieczności wpisywania ().
A teraz można uzyskać do niego dostęp jako taki
źródło
W Kotlin 1.3 możesz to zrobić jak
źródło
Nie ma standardowej metody, która to robi, ale możesz łatwo utworzyć własną, używając jednej z nich
Math.random()
lub klasyjava.util.Random
. Oto przykład wykorzystującyMath.random()
metodę:Oto przykładowe dane wyjściowe:
źródło
Biblioteka standardu Kotlin nie zapewnia interfejsu API generatora liczb losowych. Jeśli nie jesteś w projekcie wieloplatformowym, lepiej skorzystać z api platformy (wszystkie pozostałe odpowiedzi na pytanie mówią o tym rozwiązaniu) .
Ale jeśli pracujesz w kontekście wieloplatformowym, najlepszym rozwiązaniem jest samodzielne zaimplementowanie losowego w czystym kotlinie w celu współdzielenia tego samego generatora liczb losowych między platformami. Programowanie i testowanie jest prostsze.
Aby odpowiedzieć na ten problem w moim osobistym projekcie, wdrażam czysty liniowy generator kongruencyjny Kotlin . LCG to algorytm używany przez
java.util.Random
. Kliknij ten link, jeśli chcesz go użyć: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Mój cel realizacji
nextInt(range: IntRange)
dla Ciebie;).Uważaj na mój cel, LCG jest dobre w większości przypadków użycia (symulacja, gry itp.), Ale nie nadaje się do użytku kryptograficznego ze względu na przewidywalność tej metody.
źródło
Jeśli liczby, z których chcesz wybierać, nie są kolejnymi liczbami, możesz użyć
random()
.Stosowanie:
Zwraca jedną z liczb znajdujących się na liście.
źródło
Nie ma już potrzeby korzystania z niestandardowych funkcji rozszerzeń. IntRange ma teraz
random()
funkcję rozszerzenia od razu po wyjęciu z pudełka.źródło
Używając funkcji najwyższego poziomu, możesz osiągnąć dokładnie taką samą składnię wywołań jak w Rubim (jak chcesz):
Stosowanie:
źródło
Najpierw potrzebujesz RNG. W Kotlinie obecnie musisz korzystać z platform specyficznych dla platformy (nie ma wbudowanego Kotlina). Dla JVM to
java.util.Random
. Musisz utworzyć jego instancję, a następnie zadzwonićrandom.nextInt(n)
.źródło
Mam nadzieję że to pomoże.
źródło
Możesz utworzyć funkcję rozszerzenia:
Wartość Round Float:
Zastosowanie metody:
Wynik:
źródło
Pełny kod źródłowy. Może kontrolować, czy dozwolone są duplikaty.
źródło
Ilekroć jest sytuacja, w której chcesz wygenerować klucz lub adres mac, który jest liczbą szesnastkową zawierającą cyfry na podstawie żądania użytkownika, a także przy użyciu Androida i Kotlin, mój poniższy kod pomoże ci:
źródło
być super duperem))
źródło