Apakah ada cara untuk menghasilkan angka acak dalam rentang yang ditentukan (misalnya dari 1 hingga 6: 1, 2, 3, 4, 5, atau 6) dalam JavaScript?
javascript
random
Mirgorod
sumber
sumber
Math.floor((Math.random()*10)+1);
tidak dapat bekerja untuk Anda seperti yang ditentukan di sini di w3schools.com/jsref/jsref_random.asp ..?Jawaban:
Penting
Kode berikut hanya berfungsi jika nilai minimumnya adalah
1
. Itu tidak bekerja untuk nilai minimum selain1
.Jika Anda ingin mendapatkan bilangan bulat acak antara 1 ( dan hanya 1 ) dan 6, Anda akan menghitung:
Dimana:
sumber
Math.floor(Math.random() * 6) + 2
berarti bahwa jikaMath.random()
hasil menjadi 0.99 nilai acak kami akan menjadi7
Apa yang ia lakukan "ekstra" adalah itu memungkinkan interval acak yang tidak dimulai dengan 1. Jadi Anda bisa mendapatkan nomor acak dari 10 hingga 15 misalnya. Fleksibilitas.
sumber
to
arg,from
arg berfungsi ganda sebagai maxReturns 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 ()
Mengembalikan angka acak bilangan bulat antara min ( termasuk ) dan maks ( termasuk ):
Atau angka acak antara min ( termasuk ) dan maks ( tidak termasuk ):
Contoh berguna (bilangan bulat):
** Dan selalu senang diingatkan (Mozilla):
sumber
[1,2]
, ada 25% kemungkinanMath.random()
akan memberikan nomor dari salah satu[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Membulatkan interval tersebut akan menghasilkan 0, 1, 1, 2 yang bukan distribusi genap. Flooring mereka menghasilkan 0, 0, 1, 1.Math.round
lebih dari ituMath.floor
akan memberikan hasil yang berbeda.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Solusi lain:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Coba online
sumber
~~a
dan Bitwise OR (a | 0) adalah cara yang lebih cepat untuk menulis Math.floor (a)a | 0
juga merupakan cara tercepat dan paling optimal untuk mengkonversi string ke integer. Ini hanya bekerja dengan string yang berisi bilangan bulat ("444"
dan"-444"
), yaitu tidak ada float / fraksi. Ini menghasilkan0
untuk semua yang gagal. Ini adalah salah satu optimasi utama di balik asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
danMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Untuk mendapatkan nomor acak
generateRandomInteger(-20, 20);
PENJELASAN DI BAWAH INI
Kita perlu mendapatkan integer acak, misalkan X antara min dan maks.
Baik?
yaitu min <= X <= maks
Jika kita mengurangi min dari persamaan, ini sama dengan
0 <= (X - mnt) <= (Maks - mnt)
Sekarang, mari kita gandakan ini dengan angka acak r yang
0 <= (X - mnt) * r <= (maks - mnt) * r
Sekarang, mari tambahkan kembali min ke persamaan
min <= min + (X - min) * r <= min + (maks - min) * r
Sekarang, mari kita pilih fungsi yang menghasilkan r sehingga memenuhi rentang persamaan kita sebagai [min, maks]. Ini hanya mungkin jika 0 <= r <= 1
BAIK. Sekarang, kisaran r yaitu [0,1] sangat mirip dengan hasil fungsi Math.random (). Bukan?
Sebagai contoh,
Kasus r = 0
min
+ 0 * (max
-min
) = mntKasus r = 1
min
+1 * (max
-min
) = maksKasus Acak menggunakan Math.random 0 <= r <1
min
+ r * (max
-min
) = X , di mana X memiliki rentang min <= X < maksHasil di atas X adalah angka acak. Namun karena Math.random () batas kiri kami inklusif, dan batas kanan eksklusif. Untuk memasukkan batas kanan kami, kami menambah batas kanan 1 dan lantai hasilnya.
Untuk mendapatkan nomor acak
generateRandomInteger(-20, 20)
;sumber
Atau, dalam Garis Bawah
sumber
sumber
jsfiddle: https://jsfiddle.net/cyGwf/477/
Random Integer : untuk mendapatkan integer acak antara
min
danmax
, gunakan kode berikutRandom Floating Point Number : untuk mendapatkan nomor floating point acak antara
min
danmax
, gunakan kode berikutReferensi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
sumber
Matematika bukanlah kelebihan saya, tetapi saya telah mengerjakan sebuah proyek di mana saya perlu menghasilkan banyak angka acak antara positif dan negatif.
Misalnya
Tentu saja, Anda juga dapat menambahkan beberapa validasi untuk memastikan Anda tidak melakukan ini dengan selain angka. Pastikan juga bahwa min selalu kurang dari atau sama dengan maks.
sumber
min + Math.random() * max
akan memberi Anda angka antara min dan min + maks, yang bukan yang Anda inginkan. Cabang pertama dariif
benar, tetapi bisa disederhanakan untuk mengatakanreturn min + Math.random() * (max - min)
, yang merupakan solusi yang benar terlepas dari apakah min positif atau negatif (lihat jawaban lain). Juga, perlu diingat bahwa Anda masih perlu menurunkan hasilnya jika Anda tidak ingin pecahan.Saya menulis fungsi yang lebih fleksibel yang dapat memberi Anda nomor acak tetapi tidak hanya bilangan bulat.
Versi tetap.
sumber
Contoh
Kembalikan angka acak antara 1 dan 10:
Hasilnya bisa:
3
Coba sendiri: di sini
-
atau menggunakan lodash / undescore:
_.random(min, max)
Docs: - lodash - undescore
sumber
Terlepas dari banyak jawaban dan hasil yang hampir sama. Saya ingin menambahkan jawaban saya dan menjelaskan cara kerjanya. Karena itu penting untuk memahami kerjanya daripada menyalin menyisipkan satu kode baris. Menghasilkan angka acak hanyalah matematika sederhana.
KODE:
sumber
Saya sedang mencari generator nomor acak yang ditulis dalam TypeScript dan saya telah menulis ini setelah membaca semua jawaban, berharap ini akan bekerja untuk coders TypeScript.
sumber
Math.random()
cepat dan cocok untuk banyak tujuan, tetapi tidak tepat jika Anda membutuhkan nilai-nilai yang aman secara kriptografis (tidak aman), atau jika Anda memerlukan bilangan bulat dari distribusi yang sama sekali tidak bias (pendekatan multiplikasi yang digunakan dalam jawaban lain menghasilkan nilai-nilai tertentu sedikit lebih sering lebih sering dari yang lain).Dalam kasus seperti itu, kita dapat menggunakan
crypto.getRandomValues()
untuk menghasilkan integer aman, dan menolak nilai apa pun yang dihasilkan yang tidak dapat dipetakan secara seragam ke dalam rentang target. Ini akan lebih lambat, tetapi seharusnya tidak signifikan kecuali Anda menghasilkan nilai yang sangat besar.Untuk memperjelas masalah distribusi bias, pertimbangkan kasus di mana kami ingin menghasilkan nilai antara 1 dan 5, tetapi kami memiliki generator angka acak yang menghasilkan nilai antara 1 dan 16 (nilai 4-bit). Kami ingin memiliki jumlah yang sama dari pemetaan nilai yang dihasilkan untuk setiap nilai output, tetapi 16 tidak dibagi rata dengan 5: ia meninggalkan sisa dari 1. Jadi kita perlu menolak 1 dari nilai yang mungkin dihasilkan, dan hanya melanjutkan ketika kita mendapatkan salah satu dari 15 nilai lebih rendah yang dapat dipetakan secara seragam ke dalam kisaran target kami. Perilaku kita bisa terlihat seperti kodesemu ini:
Kode berikut menggunakan logika yang sama, tetapi menghasilkan bilangan bulat 32-bit sebagai gantinya, karena itulah ukuran bilangan bulat umum terbesar yang dapat diwakili oleh
number
tipe standar JavaScript . (Ini dapat dimodifikasi untuk menggunakanBigInt
s jika Anda membutuhkan rentang yang lebih besar.) Terlepas dari rentang yang dipilih, fraksi dari nilai yang dihasilkan akan selalu kurang dari 0,5, sehingga jumlah penolakan yang diharapkan akan selalu kurang dari 1,0 dan biasanya mendekati 0,0; Anda tidak perlu khawatir tentang hal itu berulang selamanya.sumber
Menambahkan
float
dengan versi presisi tetap berdasarkanint
versi dalam jawaban @ Francisc:begitu:
dan untuk jawaban int
sumber
Nomor integer acak crypto-kuat dalam rentang [a, b] (asumsi: a <b)
sumber
Ini seharusnya bekerja:
sumber
Saya menemukan cara baru yang hebat untuk melakukan ini menggunakan parameter default ES6. Ini sangat bagus karena memungkinkan satu argumen atau dua argumen. Ini dia:
sumber
Ini terlambat sekitar sembilan tahun, tetapi randojs.com menjadikan ini satu kalimat sederhana:
Anda hanya perlu menambahkan ini ke kepala dokumen html Anda, dan Anda dapat melakukan apa saja yang Anda inginkan dengan mudah secara acak. Nilai acak dari array, elemen jquery acak, properti acak dari objek, dan bahkan mencegah pengulangan jika diperlukan.
sumber
Ini berfungsi untuk saya dan menghasilkan nilai-nilai seperti fungsi library standar random.randint Python :
sumber
Coba gunakan:
sumber
mengembalikan 1-6 seperti dadu pada dasarnya,
sumber