Lebih
Menghasilkan nomor acak antara dua angka di JavaScript
Apakah ada cara untuk menghasilkan nomor acak dalam kisaran tertentu (misalnya dari 1 sampai 6: 1, 2, 3, 4, 5, atau 6) dalam JavaScript?
1626
20
Apa itu "tambahan" hal ini memungkinkan interval waktu yang acak yang tidak mulai dengan 1. Agar anda bisa mendapatkan nomor acak dari 10 sampai 15 misalnya. Fleksibilitas.
Penting
Kode berikut berfungsi hanya jika nilai minimum adalah `1`. Ini tidak bekerja untuk minimum nilai-nilai lain dari `1`.Jika anda ingin mendapatkan bilangan bulat acak antara 1 (**1***) dan 6, anda akan menghitung:
Dimana:
Matematika.random()
Dari Mozilla Pengembang Jaringan dokumentasi:
Berguna contoh:
Solusi lain:
(Matematika.random() * 6 | 0) + 1
~~(Matematika.random() * 6) + 1
Mencoba online
TL;DR
Untuk mendapatkan nomor acak
generateRandomInteger(-20, 20);
PENJELASAN DI BAWAH INI
Kita perlu untuk mendapatkan bilangan bulat acak, mengatakan X antara min dan max.
Kan?
aku.e min <= X <= max
Jika kita kurangi menit dari persamaan ini setara dengan
0 <= (X - min) <= (max - min)
Sekarang, mari kita kalikan ini dengan nomor acak r yang
0 <= (X - min) r <= (max - min) r
Sekarang, mari kita tambahkan kembali min untuk persamaan
min <= min + (X - min) r <= min + (max - min) r
Sekarang, mari kita memilih fungsi yang menghasilkan r seperti yang memenuhi persamaan kami sebagai [min,max]. Ini hanya mungkin jika 0<= r <=1
OK. Sekarang, kisaran r i.e [0,1] adalah sangat mirip dengan Matematika.random() hasil fungsi. Isn't itu?
Misalnya,
Kasus r = 0
min
+ 0 * (max
-min
) = minKasus r = 1
min
+ 1 * (max
-min
) = maxKasus acak menggunakan Matematika.random 0 <= r < 1
min
+ r * (max
-min
) = X, dimana X memiliki jangkauan min <= X < maxHasil diatas X adalah angka acak. Namun karena Matematika.random() kiri kita terikat adalah inklusif, dan hak terikat adalah eksklusif. Untuk memasukkan hak kita terikat kita meningkatkan hak terikat oleh 1 dan lantai hasil.
Untuk mendapatkan nomor acak
generateRandomInteger(-20, 20)
;Atau, di Underscore
jsfiddle: https://jsfiddle.net/cyGwf/477/
Random Integer: untuk mendapatkan bilangan bulat acak antara
min
danmax
, gunakan kode berikutAcak Angka Floating Point: untuk mendapatkan acak angka floating point antara
min
danmax
, gunakan kode berikutReferensi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Matematika bukan titik kuat saya, tapi saya've telah bekerja pada sebuah proyek di mana saya dibutuhkan untuk menghasilkan banyak acak angka antara positif dan negatif.
E. g
Tentu saja, anda juga dapat menambahkan beberapa validasi untuk memastikan anda don't melakukan hal ini dengan sesuatu yang lain daripada angka-angka. Juga pastikan bahwa min selalu kurang dari atau sama dengan max.
Saya menulis lebih fleksibel fungsi yang dapat memberikan nomor acak tetapi tidak hanya integer.
Versi tetap.
Contoh
Kembali nomor acak antara 1 dan 10:
Hasilnya bisa menjadi:
3
Mencoba sendiri: di sini
--
atau menggunakan lodash / undescore:
_.random(min, max)
Docs:
Meskipun banyak jawaban dan hampir sama hasilnya. Saya ingin menambahkan jawaban saya dan menjelaskan kerja. Karena itu adalah penting untuk memahami kerja daripada copy paste satu baris kode. Menghasilkan angka acak adalah apa-apa tapi sederhana matematika.
KODE:
Aku sedang mencari nomor acak generator yang tertulis dalam Naskah dan saya telah menulis ini setelah membaca semua jawaban, berharap Itu akan bekerja untuk Naskah coders.
Menambahkan
float
dengan tetap presisi versi berdasarkanint
versi di @Francisc's jawaban:jadi:
dan untuk int jawaban
Matematika.random()
adalah cepat dan cocok untuk banyak tujuan, tetapi itu's tidak tepat jika anda membutuhkan kriptografi yang aman nilai-nilai (it's tidak aman), atau jika anda membutuhkan bilangan bulat dari yang benar-benar seragam berisi distribusi (perkalian pendekatan yang digunakan dalam jawaban orang lain menghasilkan nilai-nilai tertentu sedikit lebih sering daripada yang lain).Dalam kasus tersebut, kita dapat menggunakan
kripto.getRandomValues()
untuk menghasilkan aman bilangan bulat, dan menolak apa pun yang dihasilkan nilai-nilai yang bisa kita't peta seragam ke dalam kisaran target. Ini akan menjadi lebih lambat, tetapi seharusnya't menjadi signifikan kecuali anda're menghasilkan jumlah yang sangat besar dari nilai-nilai.Untuk memperjelas bias distribusi kekhawatiran, pertimbangkan kasus di mana kita ingin menghasilkan nilai antara 1 dan 5, tapi kami memiliki nomor acak generator yang menghasilkan nilai antara 1 dan 16 (4-bit value). Kami ingin memiliki jumlah yang sama yang dihasilkan pemetaan nilai-nilai untuk masing-masing nilai output, tetapi 16 tidak merata dibagi dengan 5: meninggalkan sisa 1. Jadi kita perlu menolak 1 yang mungkin dihasilkan nilai-nilai, dan hanya terus ketika kita mendapatkan salah satu dari 15 nilai yang lebih rendah yang dapat seragam dipetakan ke dalam kisaran target. Perilaku kita bisa terlihat seperti ini pseudocode:
tidak ada Menghasilkan 4-bit integer dalam range 1-16. Jika kita dihasilkan 1, 6, atau 11 maka output 1. Jika kita menghasilkan 2, 7, 12 maka output 2. Jika kita dihasilkan 3, 8, atau 13 maka output 3. Jika kita dihasilkan 4, 9, atau 14 maka output 4. Jika kita dihasilkan 5, 10, atau 15 kemudian output 5. Jika kita menghasilkan 16 kemudian menolaknya dan mencoba lagi.
Kode berikut menggunakan logika mirip, tetapi menghasilkan 32-bit integer sebaliknya, karena yang's terbesar umum integer ukuran yang dapat diwakili oleh JavaScript's standar
nomor
jenis. (Ini bisa dimodifikasi untuk menggunakan `BigInt ini jika anda membutuhkan jangkauan yang lebih besar.) Terlepas dari pilihan yang dipilih, fraksi dihasilkan nilai-nilai yang ditolak akan selalu kurang dari 0,5, sehingga diharapkan jumlah penolakan akan selalu kurang dari 1.0 dan biasanya dekat dengan 0.0; anda don't perlu khawatir tentang hal itu looping selamanya.Ini harus bekerja:
Saya menemukan sebuah cara baru yang besar untuk melakukan hal ini menggunakan ES6 parameter default. Hal ini sangat bagus karena memungkinkan salah satu argumen atau dua argumen. Di sini adalah:
Crypto-kuat integer acak nomor di ragne [a,b] (asumsi: a < b )
untuk kembali 1-6 seperti dadu pada dasarnya, kembali Matematika.round(Math.random() * 5 + 1);
Saya menemukan Francisc's solusi di atas tidak termasuk min atau max jumlah hasil, jadi aku berubah seperti ini: