Bagaimana saya bisa menghasilkan bilangan bulat acak antara dua variabel yang ditentukan dalam JavaScript, mis x = 4
dan y = 8
akan menghasilkan salah satu 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
sumber
sumber
Jawaban:
Ada beberapa contoh di halaman Jaringan Pengembang Mozilla :
Inilah logika di baliknya. Ini aturan sederhana tiga:
Math.random()
mengembalikan aNumber
antara 0 (inklusif) dan 1 (eksklusif). Jadi kita memiliki interval seperti ini:Sekarang, kami ingin nomor antara
min
(inklusif) danmax
(eksklusif):Kita dapat menggunakan
Math.random
untuk mendapatkan koresponden dalam interval [min, maks). Tetapi, pertama-tama kita harus memfaktorkan sedikit masalah dengan mengurangimin
dari interval kedua:Ini memberi:
Kami sekarang dapat menerapkan
Math.random
dan kemudian menghitung koresponden. Mari kita pilih nomor acak:Jadi, untuk menemukan
x
, kami akan melakukan:Jangan lupa untuk menambahkan
min
kembali, sehingga kami mendapatkan nomor dalam interval [min, maks):Itu adalah fungsi pertama dari MDN. Yang kedua, mengembalikan bilangan bulat antara
min
danmax
, keduanya inklusif.Sekarang untuk mendapatkan bilangan bulat, Anda bisa menggunakan
round
,ceil
ataufloor
.Anda dapat menggunakan
Math.round(Math.random() * (max - min)) + min
, namun ini memberikan distribusi yang tidak rata. Keduanya,min
danmax
hanya memiliki sekitar setengah peluang untuk bergulir:Dengan
max
dikecualikan dari interval, itu memiliki peluang lebih kecil untuk bergulir daripadamin
.Dengan
Math.floor(Math.random() * (max - min +1)) + min
Anda memiliki distribusi yang merata.Anda tidak dapat menggunakan
ceil()
dan-1
dalam persamaan itu karenamax
sekarang memiliki sedikit peluang untuk menggulung, tetapi Anda juga dapat menggulung hasil (yang tidak diinginkan)min-1
.sumber
floor
, yang membulatkan ke bawah.round
, tetapi kemudian keduanya,min
danmax
hanya memiliki setengah kesempatan untuk memutar seperti yang dilakukan nomor-nomor lainnya. Anda juga bisa mengurangi satu dan mengambilceil
. Namun hal ini meninggalkanmax
angka dengan kesempatan lebih sedikit untuk menggulung karena[0,1)
Interval.sumber
(Math.random() * (maximum - minimum + 1) ) << 0
lebih cepat.x << 0
,x | 0
,~~x
) bukannyaMath.floor()
bertobatx
menjadi dua pelengkap dengan berbagai jauh lebih kecil dariNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs 2⁵³), sehingga Anda harus menggunakannya dengan hati-hati!657348096152|0
Anda mendapatkan 218099864 (1100111111111111000010011000 dalam biner).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
pemakaian:
kerusakan:
Kami mengembalikan fungsi (meminjam dari pemrograman fungsional) yang ketika dipanggil, akan mengembalikan integer acak antara nilai-nilai
bottom
dantop
, inklusif. Kami mengatakan 'inklusif' karena kami ingin memasukkan bagian bawah dan atas dalam kisaran angka yang dapat dikembalikan. Cara ini,getRandomizer( 1, 6 )
akan mengembalikan 1, 2, 3, 4, 5, atau 6.(bawah adalah angka yang lebih rendah, atas adalah jumlah yang lebih besar)
Math.random()
mengembalikan ganda acak antara 0 dan 1, dan jika kita mengalikannya dengan satu ditambah perbedaan antaratop
danbottom
, kita akan mendapatkan ganda di antara0
dan1+b-a
.Math.floor
membulatkan angka ke bilangan bulat terdekat. Jadi sekarang kita memiliki semua bilangan bulat antara0
dantop-bottom
. Angka 1 terlihat membingungkan, tetapi harus ada di sana karena kita selalu dibulatkan ke bawah, sehingga angka teratas tidak akan pernah tercapai tanpa itu. The desimal acak kita menghasilkan kebutuhan untuk berada di kisaran0
ke(1+top-bottom)
sehingga kita dapat menggenapkan ke bawah dan mendapatkan int dalam kisaran0
untuktop-bottom
Kode pada contoh sebelumnya memberi kita integer dalam range
0
dantop-bottom
, jadi yang perlu kita lakukan sekarang adalah menambahbottom
hasil itu untuk mendapatkan integer dalam rangebottom
dantop
inklusif. : DCATATAN: Jika Anda memberikan nilai non-integer atau angka yang lebih besar terlebih dahulu Anda akan mendapatkan perilaku yang tidak diinginkan, tetapi kecuali ada yang memintanya, saya tidak akan menyelidiki kode pemeriksaan argumen karena agak jauh dari maksud pertanyaan aslinya .
sumber
Alternatif jika Anda menggunakan Underscore.js yang dapat Anda gunakan
sumber
_.uniqueId()
fungsi yang dapat Anda panggil untuk model sisi klien.x << 0
,x | 0
,~~x
) bukannyaMath.floor()
bertobatx
menjadi dua pelengkap dengan berbagai jauh lebih kecil dariNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs 2⁵³), sehingga Anda harus menggunakannya dengan hati-hati!Kembalikan angka acak antara 1 dan 10:
Kembalikan angka acak antara 1 dan 100:
sumber
Jika Anda membutuhkan variabel antara 0 dan maks, Anda dapat menggunakan:
sumber
Jawaban lain tidak menjelaskan parameter masuk akal
0
dan masuk akal1
. Sebaliknya Anda harus menggunakanround
bukan dariceil
ataufloor
:sumber
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
Apakah 9 & 7 datang antara 5 & 6? ...... Anda harus memperbaikinya atau menjelaskan ..Berikut ini adalah Implementasi MS DotNet dari kelas Acak di javascript-
Menggunakan:
sumber
Gunakan fungsi ini untuk mendapatkan angka acak antara rentang yang diberikan
sumber
Setelah menghasilkan nomor acak menggunakan program komputer, itu masih dianggap sebagai nomor acak jika nomor yang dipilih adalah bagian atau penuh dari yang awal. Tetapi jika itu diubah, maka matematikawan tidak menerimanya sebagai angka acak dan mereka dapat menyebutnya angka bias. Tetapi jika Anda sedang mengembangkan program untuk tugas sederhana, ini tidak akan menjadi kasus untuk dipertimbangkan. Tetapi jika Anda mengembangkan suatu program untuk menghasilkan angka acak untuk hal-hal berharga seperti program lotere, atau permainan judi, maka program Anda akan ditolak oleh manajemen jika Anda tidak mempertimbangkan tentang kasus di atas.
Jadi untuk orang-orang seperti itu, inilah saran saya:
Hasilkan nomor acak menggunakan
Math.random()
. (Katakan inin
)Jika Anda tahu cara membaca tabel angka acak untuk memilih angka acak, Anda tahu proses di atas (dikalikan dengan 1, 10, 100 dan seterusnya) tidak melanggar salah satu yang saya sebutkan di awal. (Karena hanya mengubah tempat titik desimal.)
Pelajari contoh berikut dan kembangkan sesuai kebutuhan Anda.
Jika Anda membutuhkan sampel [0,9] maka lantai n * 10 adalah jawaban Anda dan jika perlu [0,99] maka lantai n * 100 adalah jawaban Anda dan seterusnya.
Sekarang, mari masuk ke dalam peran Anda:
Anda telah menanyakan nomor di antara rentang tertentu. (Dalam hal ini Anda bias di antara rentang itu. - Dengan mengambil angka dari [1,6] dengan menggulung dadu, maka Anda bias menjadi [1,6] tapi tetap saja itu acak jika dan hanya jika dadu tidak bias .)
Jadi pertimbangkan kisaran Anda ==> [78, 247] jumlah elemen rentang = 247 - 78 + 1 = 170; (karena kedua batas inklusif.
Catatan: Di metode satu, pertama saya membuat array yang berisi angka yang Anda butuhkan dan kemudian secara acak memasukkannya ke array lain. Dalam metode dua, hasilkan angka secara acak dan periksa apakah ada dalam kisaran yang Anda butuhkan. Lalu masukkan ke dalam array. Di sini saya menghasilkan dua angka acak dan menggunakan totalnya untuk memaksimalkan kecepatan program dengan meminimalkan tingkat kegagalan yang memperoleh angka yang bermanfaat. Namun menambahkan angka yang dihasilkan juga akan memberikan sedikit kecocokan. Jadi saya akan merekomendasikan metode pertama saya untuk menghasilkan angka acak dalam rentang tertentu.
Dalam kedua metode, konsol Anda akan menunjukkan hasilnya. (Tekan f12 di Chrome untuk membuka konsol)
sumber
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] angka 1 dan 6 akan selalu digulirkan lebih sedikit dari 2, 3, 4, dan 5. Namun, perbedaannya pada dasarnya tidak signifikan.Untuk bilangan bulat acak dengan rentang, coba:
sumber
Untuk menguji fungsi ini, dan variasi fungsi ini, simpan HTML / JavaScript di bawah ini ke file dan buka dengan browser. Kode akan menghasilkan grafik yang menunjukkan distribusi satu juta panggilan fungsi. Kode juga akan merekam kasus tepi, jadi jika fungsi menghasilkan nilai lebih besar dari maks, atau kurang dari min, Anda.will.know.about.it.
sumber
Untuk mendapatkan nomor acak katakan antara 1 dan 6, pertama lakukan:
Ini mengalikan angka acak dengan 6 dan kemudian menambahkan 0,5 ke dalamnya. Selanjutnya bulatkan angka ke bilangan bulat positif dengan melakukan:
Ini membulatkan angka ke seluruh nomor terdekat.
Atau untuk membuatnya lebih dimengerti lakukan ini:
Secara umum kode untuk melakukan ini menggunakan variabel adalah:
Alasan untuk mengambil 0,5 dari nilai minimum adalah karena menggunakan nilai minimum saja akan memungkinkan Anda untuk mendapatkan bilangan bulat yang satu lebih dari nilai maksimum Anda. Dengan mengambil 0,5 dari nilai minimum Anda pada dasarnya mencegah nilai maksimum dibulatkan.
Semoga itu bisa membantu.
sumber
Menggunakan kode berikut Anda dapat menghasilkan array angka acak, tanpa berulang, dalam rentang yang diberikan.
sumber
Saya tahu pertanyaan ini sudah dijawab tetapi jawaban saya dapat membantu seseorang.
Saya menemukan metode sederhana ini di W3Schools:
Semoga ini bisa membantu seseorang.
sumber
Seluruh angka acak antara terendah dan tertinggi:
Bukan solusi yang paling elegan .. tapi sesuatu yang cepat.
sumber
Inilah yang saya gunakan untuk menghasilkan angka acak.
Kami mengeksekusi
high++
karenaMath.random()
menghasilkan angka acak antara 0, (termasuk), dan 1 (eksklusif) Yang dikecualikan, berarti kami harus menambah tinggi dengan satu sebelum mengeksekusi matematika apa pun. Kami kemudian mengurangi rendah dari tinggi, memberi kami angka tertinggi untuk menghasilkan - rendah, lalu + rendah, membawa tinggi kembali ke normal, dan membuat angka terendah minimal rendah. lalu kami kembalikan nomor yang dihasilkanrandom(7,3)
bisa kembali3,4,5,6, or 7
sumber
high
hanya digunakan satu kali, Anda sebaiknya menggunakanhigh-low+1
daripada memiliki pernyataan kenaikan yang terpisah. Juga, sebagian besar pengguna akan mengharapkanlow
parameter menjadi yang utama.Uint8Array membuat array yang diisi dengan angka hingga 3 digit yang akan menjadi maksimum 999. Kode ini sangat pendek.
sumber
Berikut adalah contoh fungsi javascript yang dapat menghasilkan angka acak dari panjang yang ditentukan tanpa menggunakan Math.random ():
sumber
ini adalah pendapat saya tentang bilangan acak dalam suatu rentang, karena saya ingin mendapatkan bilangan acak dalam rentang basis untuk eksponen. mis. basis = 10, eksponen = 2, memberikan angka acak dari 0 hingga 100, idealnya, dan seterusnya.
jika itu membantu menggunakannya, ini dia:
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 bisa 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
Crypto-Strong
Untuk mendapatkan angka integer acak crypto-kuat dalam ragne [x, y] coba
sumber
Anda dapat memberi Anda potongan kode ini,
sumber
do - while
sebagai gantiwhile
Ionuț G. Stan menulis jawaban yang bagus tetapi agak terlalu rumit untuk saya pahami. Jadi, saya menemukan penjelasan yang lebih sederhana dari konsep yang sama di https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation oleh Jason Anello.
CATATAN: Satu-satunya hal penting yang harus Anda ketahui sebelum membaca penjelasan Jason adalah definisi "truncate". Dia menggunakan istilah itu saat menggambarkan
Math.floor()
. Kamus Oxford mendefinisikan "truncate" sebagai:sumber
Ini dapat menangani menghasilkan hingga 20 digit nomor acak UNIK
JS
JsFiddle
sumber
/ * Tulis fungsi yang disebut
randUpTo
yang menerima angka dan mengembalikan bilangan bulat acak antara 0 dan angka itu? * // * Tulis fungsi yang dipanggil
randBetween
yang menerima dua angka yang mewakili suatu rentang dan mengembalikan seluruh angka acak di antara kedua angka itu. * // * Tulis fungsi yang dipanggil
randFromTill
yang menerima dua angka yang mewakili rentang dan mengembalikan angka acak antara min (inklusif) dan maks (eksklusif). * // * Tulis fungsi yang dipanggil
randFromTo
yang menerima dua angka yang mewakili rentang dan mengembalikan bilangan bulat acak antara min (inklusif) dan maks (inklusif) * /sumber
Saya membuat fungsi ini yang mempertimbangkan opsi akun seperti min, max, mengecualikan (daftar int untuk dikecualikan), dan seed (jika Anda ingin generator acak diunggulkan).
Dapat digunakan seperti:
Atau lebih sederhana:
Maka Anda dapat melakukan:
Intisari: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
sumber
Math.floor membulatkan angka ke bilangan bulat terdekat
Jadi untuk menghasilkan bilangan bulat acak antara 4 dan 8 inklusif, panggil fungsi di atas dengan argumen berikut:
sumber
Metode saya menghasilkan angka acak antara 0 dan n, di mana n <= 10 (n dikecualikan):
sumber