Metode generik yang dapat mengembalikan bilangan bulat acak antara 2 parameter seperti halnya ruby rand(0..n)
.
Ada saran?
Saran saya akan menjadi fungsi ekstensi di IntRange untuk membuat tebusan seperti ini:(0..10).random()
Pada 1.3, Kotlin hadir dengan generator Acak multi-platform sendiri. Ini dijelaskan dalam KEEP ini . Ekstensi yang dijelaskan di bawah sekarang menjadi bagian dari perpustakaan standar Kotlin , cukup gunakan seperti ini:
val rnds = (0..10).random()
Sebelum 1.3, pada JVM kita menggunakan Random
atau bahkan ThreadLocalRandom
jika kita menggunakan JDK> 1.6.
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
Digunakan seperti ini:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
Jika Anda ingin fungsi hanya kembali 1, 2, ..., 9
( 10
tidak termasuk), gunakan rentang yang dibangun dengan until
:
(0 until 10).random()
Jika Anda bekerja dengan JDK> 1.6, gunakan ThreadLocalRandom.current()
sebagai ganti Random()
.
Kotlin dan variasi lainnya
Untuk kotlinjs dan kasus penggunaan lainnya yang tidak memungkinkan penggunaan java.util.Random
, lihat alternatif ini .
Juga, lihat jawaban ini untuk variasi saran saya. Ini juga mencakup fungsi ekstensi untuk Char
s acak .
java.util.Random
?Hasilkan bilangan bulat acak antara
from
(inklusif) danto
(eksklusif)sumber
Int
s acak acak , Anda bisa menggunakan Random # int (size, from, to) sebagai gantinya di java-8 .Pada kotlin 1.2, Anda dapat menulis:
(1..3).shuffled().last()
Sadarilah itu besar O (n), tetapi untuk daftar kecil (terutama nilai-nilai unik) tidak apa-apa: D
sumber
Anda dapat membuat fungsi ekstensi yang mirip dengan
java.util.Random.nextInt(int)
tetapi yang mengambilIntRange
alih - alihInt
untuk terikat:Anda sekarang dapat menggunakan ini dengan
Random
contoh apa pun :Jika Anda tidak ingin harus mengatur
Random
instance Anda sendiri maka Anda dapat menentukan metode kenyamanan menggunakan, misalnyaThreadLocalRandom.current()
,:Sekarang Anda bisa mendapatkan bilangan bulat acak seperti di Ruby tanpa harus terlebih dahulu mendeklarasikan
Random
instance:sumber
Kemungkinan Variasi untuk jawaban saya yang lain untuk karakter acak
Untuk mendapatkan
Char
s acak , Anda dapat menentukan fungsi ekstensi seperti iniJika Anda bekerja dengan JDK> 1.6, gunakan
ThreadLocalRandom.current()
sebagai gantiRandom()
.Untuk kotlinjs dan kasus penggunaan lainnya yang tidak memungkinkan penggunaan
java.util.Random
, jawaban ini akan membantu.Kotlin> = 1.3 dukungan multi platform untuk Acak
Pada 1.3, Kotlin hadir dengan generator Acak multiplatform sendiri. Ini dijelaskan dalam KEEP ini . Anda sekarang dapat langsung menggunakan ekstensi sebagai bagian dari perpustakaan standar Kotlin tanpa mendefinisikannya:
sumber
Membangun dari @ s1m0nw1 jawaban yang sangat baik saya membuat perubahan berikut.
Kode:
Kasus cobaan:
sumber
Contoh acak dalam kisaran [1, 10]
atau memanfaatkan Java Random
sumber
Kotlin> = 1.3, dukungan multi platform untuk Acak
Pada 1.3, perpustakaan standar menyediakan dukungan multi-platform untuk tebusan, lihat jawaban ini .
Kotlin <1.3 pada JavaScript
Jika Anda bekerja dengan Kotlin JavaScript dan tidak memiliki akses ke
java.util.Random
, yang berikut ini akan berfungsi:Digunakan seperti ini:
sumber
Cara lain untuk mengimplementasikan jawaban s1m0nw1 adalah dengan mengaksesnya melalui variabel. Bukan berarti ini lebih efisien tetapi menghemat Anda dari keharusan mengetik ().
Dan sekarang dapat diakses seperti itu
sumber
Di Kotlin 1.3 Anda bisa melakukannya
sumber
Tidak ada metode standar yang melakukan ini tetapi Anda dapat dengan mudah membuat sendiri menggunakan salah satu
Math.random()
atau kelasjava.util.Random
. Berikut ini adalah contoh menggunakanMath.random()
metode ini:Ini adalah contoh output:
sumber
Lib standar Kotlin tidak menyediakan API Penghasil Angka Acak. Jika Anda tidak berada dalam proyek multi platform, lebih baik menggunakan api platform (semua yang lain menjawab pertanyaan, bicarakan solusi ini) .
Tetapi jika Anda berada dalam konteks multi platform, solusi terbaik adalah menerapkan sendiri secara acak di kotlin murni untuk berbagi generator angka acak yang sama antar platform. Ini lebih mudah untuk dev dan pengujian.
Untuk menjawab masalah ini dalam proyek pribadi saya, saya menerapkan Generator Congruential Kotlin Linear murni . LCG adalah algoritma yang digunakan oleh
java.util.Random
. Ikuti tautan ini jika Anda ingin menggunakannya: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4Tujuan implementasi saya
nextInt(range: IntRange)
untuk Anda;).Jaga tujuan saya, LCG baik untuk sebagian besar kasus penggunaan (simulasi, game, dll ...) tetapi tidak cocok untuk penggunaan kriptografis karena dapat diprediksi metode ini.
sumber
Jika angka yang ingin Anda pilih tidak berurutan, Anda bisa menggunakan
random()
.Pemakaian:
Mengembalikan salah satu angka yang ada dalam daftar.
sumber
Tidak perlu menggunakan fungsi ekstensi khusus lagi. IntRange memiliki
random()
fungsi ekstensi di luar kotak sekarang.sumber
Menggunakan fungsi tingkat atas, Anda dapat mencapai sintaks panggilan yang sama persis seperti di Ruby (seperti yang Anda inginkan):
Pemakaian:
sumber
Pertama, Anda membutuhkan RNG. Di Kotlin saat ini Anda harus menggunakan platform spesifik (tidak ada Kotlin yang dibangun dalam satu). Untuk JVM itu
java.util.Random
. Anda harus membuat instance dan kemudian meneleponrandom.nextInt(n)
.sumber
Semoga ini membantu.
sumber
Anda dapat membuat fungsi ekstensi:
Nilai Float bulat:
Penggunaan metode:
Keluaran:
sumber
Kode sumber lengkap. Dapat mengontrol apakah duplikat diizinkan.
sumber
Setiap kali ada situasi di mana Anda ingin menghasilkan kunci atau alamat mac yang nomor heksadesimal memiliki digit berdasarkan permintaan pengguna, dan itu juga menggunakan android dan kotlin, maka Anda kode saya di bawah ini membantu Anda:
sumber
menjadi super duper))
sumber