隨機數字是如何產生的

WBOY
發布: 2024-07-23 21:03:14
原創
319 人瀏覽過

How Random Numbers are Generated

了解隨機數生成

隨機數在模擬、密碼學、統計採樣等各領域中發揮著至關重要的作用。本文深入探討了隨機數是如何產生的,並著重於兩種流行的程式語言:JavaScript 和 Python。

偽隨機數產生器 (PRNG)

大多數程式語言使用偽隨機數產生器(PRNG)來產生隨機數。 PRNG 使用數學演算法產生隨機出現的數字序列。這些數字並不是真正隨機的,因為它們是由稱為種子的初始值決定的。然而,它們對於許多應用來說已經足夠了。

PRNG 的特點

  1. 確定性:給定相同的種子,PRNG 將始終產生相同的數字序列。
  2. 週期性:PRNG 最終會在一定週期後重複其數字序列。
  3. 速度:PRNG 通常快速且有效率。

JavaScript:Math.random()

JavaScript 的 Math.random() 函數通常用於產生隨機數。 Math.random() 使用的確切演算法可能因不同的 JavaScript 引擎而異,但廣泛使用的演算法是 Mersenne Twister。

Math.random() 的工作原理

梅森龍捲風以其長週期和高品質的隨機性而聞名。以下是如何在 JavaScript 中實作 Mersenne Twister 演算法的簡化範例:

class MersenneTwister {
  constructor(seed) {
    if (seed === undefined) {
      seed = new Date().getTime();
    }
    this.mt = new Array(624);
    this.index = 0;
    this.mt[0] = seed;
    for (let i = 1; i < 624; i++) {
      this.mt[i] = (0x6c078965 * (this.mt[i - 1] ^ (this.mt[i - 1] >> 30)) + i) >>> 0;
    }
  }

  generate() {
    if (this.index === 0) {
      this.twist();
    }
    let y = this.mt[this.index];
    y = y ^ (y >> 11);
    y = y ^ ((y << 7) & 0x9d2c5680);
    y = y ^ ((y << 15) & 0xefc60000);
    y = y ^ (y >> 18);
    this.index = (this.index + 1) % 624;
    return y / 0xffffffff;
  }

  twist() {
    for (let i = 0; i < 624; i++) {
      const y = (this.mt[i] & 0x80000000) + (this.mt[(i + 1) % 624] & 0x7fffffff);
      this.mt[i] = this.mt[(i + 397) % 624] ^ (y >> 1);
      if (y % 2 !== 0) {
        this.mt[i] = this.mt[i] ^ 0x9908b0df;
      }
    }
  }
}

// Example usage:
const mt = new MersenneTwister(12345); // Seed value
const randomNumber = mt.generate(); // Get a random number
console.log(randomNumber);
登入後複製

此程式碼示範了用於產生隨機數的 Mersenne Twister 演算法的簡化版本。

使用 Math.random()

在 JavaScript 中,您可以使用 Math.random() 產生 0(含)和 1(不包括)之間的隨機數:

const randomNumber = Math.random();
console.log(randomNumber);
登入後複製

Python:隨機模組

Python提供了random模組,其中包含各種產生隨機數的函數。 Python 的 random 模組預設使用的 PRNG 演算法也是 Mersenne Twister。

如何使用Python的random模組

以下是在 Python 中產生隨機數的一些範例:

import random

# Generate a random float between 0.0 and 1.0
random_float = random.random()
print(random_float)

# Generate a random integer between 1 and 100
random_int = random.randint(1, 100)
print(random_int)

# Generate a random number from a normal distribution with mean 0 and standard deviation 1
random_normal = random.gauss(0, 1)
print(random_normal)
登入後複製

為隨機數產生器播種

為了確保可重複性,您可以在 Python 中播種隨機數產生器:

import random

# Seed the random number generator
random.seed(12345)

# Generate random numbers
print(random.random())
print(random.randint(1, 100))
登入後複製

每次執行程式時,使用相同的種子值將產生相同的隨機數序列。

結論

隨機數產生是一個具有廣泛應用的基本概念。雖然 JavaScript 中的 Math.random() 和 Python 中的 random 模組產生的數字並不是真正隨機的,但對於大多數實際用途來說,它們已經足夠隨機了。了解這些生成器的工作原理以及如何有效地使用它們對於開發人員和研究人員至關重要。


本文提供如何在 JavaScript 和 Python 中產生隨機數的基本概述,以及使用 Math.random() 和 Python 的 random 模組的實際範例。

以上是隨機數字是如何產生的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!