Selama 6 tahun saya memiliki halaman generator nomor acak di situs saya. Untuk waktu yang lama, ini adalah hasil pertama atau kedua di Google untuk "pembuat angka acak" dan telah digunakan untuk menentukan lusinan, jika bukan ratusan kontes dan gambar di forum diskusi dan blog (saya tahu karena saya melihat perujuk di log web dan biasanya pergi melihat-lihat).
Hari ini, seseorang mengirimi saya email untuk memberi tahu saya bahwa itu mungkin tidak seacak yang saya kira. Dia mencoba menghasilkan angka acak yang sangat besar (misalnya, antara 1 dan 1000000000000000000000) dan menemukan bahwa angka tersebut hampir selalu sama. Memang, saya membungkus fungsi dalam satu lingkaran sehingga saya bisa menghasilkan ribuan angka dan benar saja, untuk angka yang sangat besar, variasinya hanya sekitar 2 kali lipat.
Mengapa?
Ini adalah versi perulangannya, jadi Anda bisa mencobanya sendiri:
http://andrew.hedges.name/experiments/random/randomness.html
Ini mencakup implementasi langsung yang diambil dari Jaringan Pengembang Mozilla dan beberapa kode dari 1997 yang saya sapu dari halaman web yang tidak lagi ada ("Central Randomizer 1.3" dari Paul Houle). Lihat sumber untuk mengetahui cara kerja setiap metode.
Saya telah membaca di sini dan di tempat lain tentang Mersenne Twister. Yang saya minati adalah mengapa tidak akan ada variasi yang lebih besar dalam hasil dari fungsi Math.random bawaan JavaScript . Terima kasih!
sumber
Jawaban:
Nomor yang diberikan antara 1 dan 100.
Nomor yang diberikan antara 1 dan 1000.
dan seterusnya.
Jadi jika Anda memilih beberapa secara acak, maka sebagian besar nomor yang dipilih akan memiliki jumlah digit yang sama, karena sebagian besar kemungkinan nilai memiliki jumlah digit yang sama.
sumber
Hasil Anda benar-benar diharapkan. Jika bilangan acak didistribusikan secara seragam dalam rentang 1 hingga 10 ^ n, maka Anda akan mengharapkan sekitar 9/10 dari bilangan tersebut memiliki n digit, dan 9/100 selanjutnya memiliki n-1 digit.
sumber
Ada berbagai jenis keacakan. Math.random memberi Anda distribusi angka yang seragam.
Jika Anda menginginkan urutan besaran yang berbeda, saya sarankan untuk menggunakan fungsi eksponensial untuk membuat apa yang disebut distribusi hukum pangkat :
Fungsi ini akan memberi Anda jumlah angka 1 digit yang kira-kira sama dengan angka 2 digit dan sebagai angka 3 digit.
Ada juga distribusi lain untuk bilangan acak seperti distribusi normal (disebut juga distribusi Gaussian).
sumber
minimum = 1
danmaximum = 10
dan terkadang mendapatkan 11 sebagai hasilnya. Anda mungkin bermaksud untuk menggunakanMath.floor
alih-alihMath.round
Tampak sangat acak bagi saya! (Petunjuk: Ini tergantung browser.)
Secara pribadi, saya pikir implementasi saya akan lebih baik, meskipun saya mencurinya dari XKCD , yang harus SELALU diakui:
sumber
Makalah berikut menjelaskan bagaimana math.random () di browser Web utama (tidak) aman: "Pelacakan pengguna sementara di browser utama serta kebocoran dan serangan informasi lintas domain" oleh Amid Klein (2008) . Ini tidak lebih kuat dari fungsi PRNG bawaan Java atau Windows.
Di sisi lain, penerapan SFMT periode 2 ^ 19937-1 membutuhkan 2496 byte dari keadaan internal yang dipertahankan untuk setiap urutan PRNG. Beberapa orang mungkin menganggap ini sebagai biaya yang tidak termaafkan.
sumber
Jika Anda menggunakan angka seperti 1000000000000000000000 Anda melampaui akurasi dari tipe data yang digunakan Javascript. Perhatikan bahwa semua angka yang dihasilkan diakhiri dengan "00".
sumber
Saya mencoba generator nomor pseudorandom JS di Chaos Game .
Segitiga Sierpiński saya mengatakan ini sangat acak:
sumber
Nah, jika Anda menghasilkan angka hingga, katakanlah, 1e6, Anda diharapkan mendapatkan semua angka dengan probabilitas yang kira-kira sama. Itu juga berarti bahwa Anda hanya memiliki satu dari sepuluh peluang untuk mendapatkan nomor dengan satu digit lebih sedikit. Kemungkinan satu dari seratus untuk mendapatkan dua digit lebih sedikit, dll. Saya ragu Anda akan melihat banyak perbedaan saat menggunakan RNG lain, karena Anda memiliki distribusi yang seragam di seluruh angka, bukan logaritmanya.
sumber
Bilangan non-acak yang didistribusikan secara seragam dari 1 ke N memiliki sifat yang sama. Perhatikan bahwa (dalam arti tertentu) ini masalah presisi. Distribusi seragam pada 0-99 (sebagai bilangan bulat) memang memiliki 90% bilangannya memiliki dua digit. Distribusi seragam pada 0-999999 memiliki 905 nomornya yang memiliki lima digit.
Setiap rangkaian angka (dalam beberapa kondisi yang tidak terlalu membatasi) memiliki kepadatan. Ketika seseorang ingin membahas bilangan "acak", kerapatan bilangan-bilangan ini harus ditentukan (seperti disebutkan di atas.) Kepadatan yang sama adalah kerapatan seragam. Ada yang lain: kepadatan eksponensial, kepadatan normal, dll. Seseorang harus memilih kepadatan mana yang relevan sebelum mengusulkan generator bilangan acak. Selain itu, angka yang berasal dari satu kepadatan seringkali dapat dengan mudah diubah ke kepadatan lain dengan cara karies.
sumber