随机数是如何生成的

WBOY
发布: 2024-07-23 21:03:14
原创
450 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板