## Node.js 中的 Math.random 真的隨機嗎 ? 在 JavaScript 中,Math.random() 是一個經常使用的函數,用來生成隨機數。 然而,許多人並不知道它實際上不是生成真正隨機的數字,以及為什麼它被視為`偽隨機數生成器`。 > ~~身為設計系對於這種複雜數學甚麼的我是看了就頭痛X)~~ ### 偽隨機數生成器 偽隨機數生成器是使用一個初始值`種子`(預設數字)來生成一系列數字。這些數字的生成過程是確定性的,這意味著如果你從相同的`種子`開始,生成的數字序列會是完全相同的。 ### 生成隨機數的一般步驟: 1. 初始化`種子`: 當 JavaScript 運作時,通常會根據系統時間或其他隨機來源設置 `種子`。 2. 應用算法:[使用線性同餘生成器(Linear Congruential Generator, LCG)](https://en.wikipedia.org/wiki/Linear_congruential_generator)等算法,生成新的隨機數。 該算法的一個常見形式為: $$ X_{n+1} = (a \cdot X_n + c) \mod m $$ $X_n$ - 是當前的隨機數(或`種子`) $a$ - 是乘數 $c$ - 是增量 $m$ - 是模數 3. 生成數字:將生成的數字縮放到 `[0, 1]` 的範圍內,以符合 Math.random() 的輸出格式。 ### Math.random() 的局限性 * 可預測性 * 由於 Math.random() 基於確定性算法和固定的`種子`,攻擊者可以通過觀察生成的數字序列來推算出下一個數字或回推`種子`。 * 不適合安全應用 * 由於可預測性,Math.random() 不適合用於密碼學或安全性要求高的場合,例如生成密碼、API token 或加密密鑰。 ### 結論 總之,雖然 Math.random() 生成的數字在表面上看似隨機,但實際上它是基於確定性算法生成的假隨機數。對於需要真正隨機性或安全性高的應用,建議其他安全隨機數生成方法,像是 [crypto-js](https://github.com/brix/crypto-js)、[random-js](https://github.com/ckknight/random-js)。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up