Pertanyaan Menghasilkan seluruh angka acak dalam JavaScript dalam rentang tertentu?


Bagaimana saya bisa menghasilkan bilangan bulat acak antara dua variabel tertentu di Javascript, mis. x = 4 dan y = 8 akan menghasilkan 4, 5, 6, 7, 8?


1484
2017-10-06 20:05


asal


Jawaban:


Ada beberapa contoh di Jaringan Pengembang Mozilla halaman:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive)
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Inilah logika di baliknya. Ini adalah aturan sederhana dari tiga:

Math.random() mengembalikan a Number antara 0 (inklusif) dan 1 (eksklusif). Jadi kita memiliki selang waktu seperti ini:

[0 .................................... 1)

Sekarang, kami ingin nomor antara min (inklusif) dan max (eksklusif):

[0 .................................... 1)
[min .................................. max)

Kami bisa menggunakan Math.random untuk mendapatkan koresponden dalam interval [mnt, maks]. Tapi, pertama-tama kita harus mempertimbangkan sedikit masalah dengan mengurangkan min dari interval kedua:

[0 .................................... 1)
[min - min ............................ max - min)

Ini memberi:

[0 .................................... 1)
[0 .................................... max - min)

Kami sekarang dapat mendaftar Math.random dan kemudian menghitung koresponden. Mari pilih nomor acak:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

Jadi, untuk mencari x, kami akan melakukan:

x = Math.random() * (max - min);

Jangan lupa tambahkan min kembali, sehingga kita mendapatkan angka dalam interval [min, maks]:

x = Math.random() * (max - min) + min;

Itu adalah fungsi pertama dari MDN. Yang kedua, mengembalikan bilangan bulat antara min dan max, keduanya inklusif.

Sekarang untuk mendapatkan bilangan bulat, Anda bisa menggunakannya round, ceil atau floor.

Anda bisa menggunakannya Math.round(Math.random() * (max - min)) + minNamun, ini memberikan distribusi yang tidak merata. Kedua, min dan max hanya memiliki sekitar setengah kesempatan untuk menggulung:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

Dengan max dikeluarkan dari interval, ia memiliki kesempatan yang lebih sedikit untuk berguling min.

Dengan Math.floor(Math.random() * (max - min +1)) + min Anda memiliki distribusi yang merata.

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

Anda tidak bisa menggunakannya ceil() dan -1 dalam persamaan itu karena max sekarang memiliki sedikit peluang untuk menggulung, tetapi Anda dapat menggulung (tidak diinginkan) min-1 hasil juga.


3050
2017-10-06 20:08



var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

463
2017-10-06 20:09



Math.random ()

Dari Mozilla Dokumentasi Jaringan Pengembang:

// Returns a random integer between min (include) and max (include)

Math.floor(Math.random() * (max - min + 1)) + min;

Contoh yang bermanfaat:

// 0 - 10
Math.floor(Math.random() * 11);

// 1 - 10
Math.floor(Math.random() * 10) + 1;

// 5 - 20
Math.floor(Math.random() * 16) + 5;

// -10 - (-2)
Math.floor(Math.random() * 9) - 10;

72
2018-03-25 01:58



function getRandomizer(bottom, top) {
    return function() {
        return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
    }
}

pemakaian:

var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i<1000; i++ ) {
    results += rollDie() + " ";    //make a string filled with 1000 random numbers in the range 1-6.
}

kerusakan:

Kami mengembalikan fungsi (meminjam dari pemrograman fungsional) yang ketika dipanggil, akan mengembalikan bilangan bulat acak antara nilai-nilai bottom dan top, inklusif. Kami mengatakan 'inklusif' karena kami ingin menyertakan 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 angka yang lebih besar)

Math.random() * ( 1 + top - bottom )

Math.random() menghasilkan double acak antara 0 dan 1, dan jika kita mengalikannya dengan satu plus perbedaan antara top dan bottom, kita akan mendapat tempat ganda antara 0 dan 1+b-a.

Math.floor( Math.random() * ( 1 + top - bottom ) )

Math.floor membulatkan angka ke bawah ke bilangan bulat terdekat. Jadi sekarang kami memiliki semua bilangan bulat antara 0 dan top-bottom. 1 terlihat membingungkan, tetapi harus ada karena kita selalu membulatkan kebawah, sehingga angka teratas tidak akan pernah benar-benar tercapai tanpa itu. Desimal acak yang kita hasilkan harus berada dalam jangkauan 0 untuk (1+top-bottom) jadi kita bisa membulatkan dan mendapatkan int dalam jangkauan 0 untuk top-bottom

Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom

Kode dalam contoh sebelumnya memberi kami integer dalam rentang 0 dan top-bottom, jadi yang perlu kita lakukan sekarang hanyalah menambahkan bottom hasil itu untuk mendapatkan integer dalam rentang bottom dan top inklusif. : D


CATATAN: Jika Anda memberikan nilai non-bilangan bulat atau nomor yang lebih besar, Anda akan mendapatkan perilaku yang tidak diinginkan, tetapi kecuali ada yang memintanya saya tidak akan menyelidiki kode pengecekan argumen karena agak jauh dari maksud pertanyaan asli .


48
2017-10-06 20:08



Kembalikan nomor acak antara 1 dan 10:

Math.floor((Math.random()*10) + 1); 

Kembalikan nomor acak antara 1 dan 100:

Math.floor((Math.random()*100) + 1)

27
2018-03-28 11:31



function randomRange(min, max) {
  return ~~(Math.random() * (max - min + 1)) + min
}

Alternatif jika Anda menggunakan Underscore.js Kamu dapat memakai

_.random(min, max)

26
2018-02-09 19:51



Jawaban yang lain tidak memperhitungkan parameter yang sangat masuk akal 0 dan 1. Sebagai gantinya Anda harus menggunakan round  sebagai gantinya dari ceil atau floor:

function randomNumber(minimum, maximum){
    return Math.round( Math.random() * (maximum - minimum) + minimum);
}

console.log(randomNumber(0,1));  # 0 1 1 0 1 0
console.log(randomNumber(5,6));  # 5 6 6 5 5 6
console.log(randomNumber(3,-1)); # 1 3 1 -1 -1 -1

12
2017-07-21 16:42