Penjana Nombor Rawak: Bagaimana Komputer Menjana Nombor Rawak?

Orang telah menggunakan nombor rawak selama ribuan tahun, jadi konsepnya tidak baru. Dari lotere di Babylon kuno, hingga meja rolet di Monte Carlo, hingga permainan dadu di Vegas, tujuannya adalah membiarkan hasil akhirnya hingga peluang rawak.

Tetapi berjudi, keacakan mempunyai banyak kegunaan dalam sains, statistik, kriptografi dan banyak lagi. Namun menggunakan dadu, duit syiling, atau media serupa sebagai alat rawak mempunyai batasannya.

Kerana sifat mekanikal teknik ini, menghasilkan sejumlah besar nombor rawak memerlukan banyak masa dan kerja. Berkat kepintaran manusia, kami mempunyai alat dan kaedah yang lebih berkuasa.

Kaedah untuk menghasilkan nombor rawak

Nombor Rawak Benar

robot elektronik bentuk bebas melihat sekeliling

Mari kita pertimbangkan dua kaedah utama yang digunakan untuk menghasilkan nombor rawak. The Kaedah pertama adalahberdasarkan proses fizikal, dan menuai sumber rawak dari beberapa fenomena fizikal yang diharapkan dapat menjadi rawak .

Fenomena seperti itu berlaku di luar komputer. Ia diukur dan disesuaikan untuk kemungkinan bias kerana proses pengukuran. Contohnya termasuk kerosakan radioaktif, kesan fotolistrik, sinaran latar kosmik, bunyi atmosfera (yang akan kita gunakan dalam artikel ini), dan banyak lagi.

Oleh itu, nombor rawak yang dihasilkan berdasarkan keacakan tersebut dikatakan sebagai nombor rawak " benar ".

Secara teknikal, bahagian perkakasan terdiri daripada peranti yang menukar tenaga dari satu bentuk ke bentuk lain (contohnya, sinaran ke isyarat elektrik), penguat, dan penukar analog-ke-digital untuk mengubah output menjadi nombor digital.

Apakah Nombor Pseudorandom?

Kod serangan binari penggodam.  Dibuat dengan Canon 5d Mark III dan lensa vintaj analog, Leica APO Macro Elmarit-R 2.8 100mm (Tahun: 1993)

Sebagai alternatif kepada nombor rawak "benar", kaedah kedua untuk menghasilkan nombor rawak melibatkan algoritma pengkomputeran yang dapat menghasilkan hasil yang nampaknya rawak.

Mengapa nampaknya rawak? Kerana hasil akhir yang diperoleh sebenarnya ditentukan sepenuhnya oleh nilai awal yang juga dikenali sebagai nilai benih atau kunci . Oleh itu, jika anda mengetahui nilai utama dan bagaimana algoritma berfungsi, anda boleh menghasilkan semula hasil yang kelihatan rawak ini.

Penjana nombor rawak jenis ini sering disebut penjana nombor Pseudorandom dan, sebagai hasilnya, mengeluarkan Nombor Pseudorandom.

Walaupun penjana jenis ini biasanya tidak mengumpulkan data dari sumber keacakan yang berlaku secara semula jadi, pengumpulan kunci seperti itu dapat dilakukan apabila diperlukan.

Mari kita bandingkan beberapa aspek penjana nombor rawak sebenar atau penjana nombor TRNG dan pseudorandom atau PRNG s.

PRNG lebih pantas daripada TRNG. Kerana sifatnya yang menentukan, mereka berguna apabila anda perlu memainkan semula rentetan peristiwa rawak. Ini banyak membantu dalam pengujian kod, misalnya.

Sebaliknya, TRNG tidak berkala dan berfungsi dengan lebih baik dalam peranan sensitif keselamatan seperti penyulitan.

A tempoh adalah bilangan lelaran yang PRNG akan melalui sebelum ia bermula berulang. Oleh itu, semua perkara lain sama, PRNG dengan jangka masa yang lebih lama akan memerlukan lebih banyak sumber komputer untuk meramalkan dan memecahkan.

Contoh Algoritma untuk Penjana Nombor Pseudo-Rawak

Komputer melaksanakan kod yang berdasarkan sekumpulan peraturan yang harus diikuti. Untuk PRNG secara umum, peraturan tersebut berkisar pada yang berikut:

  1. Terima beberapa nombor input awal, iaitu benih atau kunci.
  2. Terapkan benih itu dalam urutan operasi matematik untuk menghasilkan hasilnya. Hasilnya adalah nombor rawak.
  3. Gunakan nombor rawak yang dihasilkan sebagai benih untuk lelaran seterusnya.
  4. Ulangi proses untuk meniru rawak.

Sekarang mari kita lihat contohnya.

Penjana Kongruen Linear

Penjana ini menghasilkan satu siri nombor pseudorandom. Diberi benih awal X 0 dan parameter integer a sebagai pengganda, b sebagai kenaikan, dan m sebagai modulus, penjana ditentukan oleh hubungan linear: X n ≡ (aX n-1 + b) mod m . Atau menggunakan sintaks yang lebih mesra pengaturcaraan: X n = (a * X n-1 + b)% m .

Setiap ahli ini mesti memenuhi syarat berikut:

  • m> 0 (modulus positif),
  • 0 <a <m (pengganda positif tetapi kurang daripada modulus),
  • 0b <m (yangkenaikan tidak negatif tetapi kurang daripada modulus), dan
  • 0X 0 <m (benihnya tidak negatif tetapi kurang daripada modulus).

Mari buat fungsi JavaScript yang mengambil nilai awal sebagai argumen dan mengembalikan pelbagai nombor rawak dengan panjang tertentu:

 // x0=seed; a=multiplier; b=increment; m=modulus; n=desired array length; const linearRandomGenerator = (x0, a, b, m, n) => { const results = [] for (let i = 0; i < n; i++) { x0 = (a * x0 + b) % m results.push(x0) } return results } 

Linear Congruential Generator adalah salah satu algoritma PRNG tertua dan paling terkenal.

Bagi algoritma penjana nombor rawak yang dapat dilaksanakan oleh komputer, ia bermula sejak 1940-an dan 50-an (kaedah Middle-square dan Lehmer generator, misalnya) dan terus ditulis hari ini (Xoroshiro128 +, Squares RNG, dan banyak lagi) .

Contoh Penjana Nombor Rawak

Ketika saya memutuskan untuk menulis artikel ini tentang memasukkan penjana nombor rawak dalam laman web, saya mempunyai pilihan untuk membuat.

Saya mungkin menggunakan Math.random()fungsi JavaScript sebagai asas dan menghasilkan output dalam nombor pseudorandom seperti yang saya ada dalam artikel sebelumnya (lihat Carta Pendaraban - Kod Jadual Waktu Sendiri).

Tetapi artikel ini sendiri adalah mengenai menghasilkan nombor rawak. Oleh itu, saya memutuskan untuk belajar bagaimana mengumpulkan data berdasarkan rawak "benar" dan berkongsi penemuan saya dengan anda.

Jadi di bawah adalah Penjana Nombor Rawak "benar". Tetapkan parameter dan tekan Generate.

Hasil Penjana Nombor Rawak Benar Perpuluhan Bilangan Perpuluhan Perpuluhan Hasil Hasil

The code fetches data from one of the APIs, courtesy of Random.org. This online resource has a plethora of useful, customizable tools and comes with excellent documentation to go with it.

The randomness comes from atmospheric noise. I was able to use asynchronous functions. That is a huge benefit going forward. The core function looks like this:

 // Generates a random number within user indicated interval const getRandom = async (min, max, base) => { const response = await  fetch("//www.random.org/integers/?num=1&min="+min+" &max="+max+"&col=1&base="+base+"&format=plain&rnd=new") return response.text() }

The parameters it takes allow a user to customize random number output. For example, min and max allow you to set lower and upper limits on generated output. And base determines if the output is printed as binary, decimal or hexadecimal.

Again, I chose this configuration but there are many more available at the source.

Apabila anda mengklik butang Hasilkan, handleGenerate()fungsi dipanggil. Ia seterusnya memanggil getRandom()fungsi tak segerak, menguruskan pengendalian ralat, dan menghasilkan hasil:

 // Output handling const handleGenerate = () => { handleActive(generateButton) const base = binary.checked ? 2 : decimal.checked ? 10 : 16 if (!minimum.value || !maximum.value) { prompter.style.color = 'red' prompter.textContent = "Enter Min & Max values" } else { getRandom(minimum.value, maximum.value, base).then((data) => { resultValue.textContent = data prompter.textContent = "" }).catch((error) => { resultValue.textContent = 'ERROR' prompter.textContent = 'Connection error. Unable to generate'; }) handleRestart() } } 

Selebihnya kod berkenaan dengan struktur, penampilan, dan gaya HTML.

Kodnya siap disisipkan dan digunakan dalam laman web ini. Saya memisahkannya menjadi bahagian komponen dan memberikan komen terperinci. Ia boleh diubahsuai dengan mudah. Anda juga dapat mengubah fungsi dan gaya mengikut keperluan anda.

Ini adalah pautan ke repo GitHub kod lengkap: //github.com/sandroarobeli/random-generator