Pertanyaan sederhana, tapi saya tertarik dengan nuansa di sini.
Saya membuat boolean acak menggunakan metode berikut yang saya buat sendiri:
const rand = Boolean(Math.round(Math.random()));
Setiap kali random()
muncul, sepertinya selalu ada jebakan - itu tidak benar-benar acak, itu dikompromikan oleh sesuatu atau lainnya, dll. Jadi, saya ingin tahu:
a) Apakah cara terbaik praktik di atas untuk melakukannya?
b) Apakah saya terlalu banyak berpikir?
c) Apakah saya memikirkan hal-hal?
d) Apakah ada cara yang lebih baik / lebih cepat / lebih elegan yang tidak saya ketahui?
(Juga agak tertarik jika B dan C saling eksklusif.)
Memperbarui
Jika itu membuat perbedaan, saya menggunakan ini untuk pergerakan karakter AI.
const rand = Math.random() < 0.5
setara dan lebih sederhana.math.random
harus banyak. Cukup gunakan milidetik untuk benih Anda.Boolean(+Date.now()%2)
Jawaban:
Secara teknis, kodenya terlihat bagus, tapi agak terlalu rumit. Anda dapat membandingkan
Math.random()
untuk0.5
langsung, sebagai kisaranMath.random()
yaitu[0, 1)
(berarti ini 'di kisaran 0 ke 1 termasuk 0, tapi tidak 1'). Anda dapat membagi rentang menjadi[0, 0.5)
dan[0.5, 1)
.sumber
let
yaitulet randomBool = Math.random() >= 0.5;
Jika proyek Anda selesai,
lodash
Anda dapat:sumber
Untuk nilai yang lebih aman secara kriptografis, Anda dapat menggunakannya
crypto.getRandomValues
di peramban modern.Sampel:
Perhatikan bahwa
crypto
objek adalah DOM API, jadi tidak tersedia di Node, tetapi ada API yang serupa untuk Node .sumber
Math.random()
sangat tidak acak dalam banyak hal, saran alternatif yang bagusa[0] > 127
sumber
Terkesan oleh jawaban Kelvin, saya ingin menyarankan solusi yang agak mirip tetapi sedikit ditingkatkan.
Solusi ini sedikit lebih jelas untuk dibaca, karena angka di sebelah kanan memberi
<
tahu Anda kemungkinan mendapatkantrue
daripada mendapatkanfalse
, yang lebih alami untuk dipahami. Juga<
satu simbol lebih pendek dari>=
;sumber
Bagaimana dengan yang ini?
sumber
Jawaban Alexander O'Mara
hanya menambahkan cuplikan kode simpul
sumber