C# 中的 Random.NextDouble() 方法

2024 年 8 月 29 日 | 5 分钟阅读

Random.NextDouble() 是 C# 中 System.Random 类的一个方法,它返回一个值在 0.0 和 1.0 之间(包括 0.0,不包括 1.0)的随机双精度浮点数值。在本文中,您将学习 C# 中的 Random.NextDouble() 方法,包括其语法、参数和示例。

以下是关于 Random.NextDouble() 的一些关键细节:

  • 它返回一个介于 0.0(包含)和 1.0(不包含)之间的双精度随机数。这意味着它可以返回 0.0,但永远不会返回 1.0。
  • 生成的数字是伪随机的,基于种子值通过算法生成。
  • 每次调用 NextDouble() 时,都会根据随机数生成器的内部状态返回一个不同的数字。
  • 您需要实例化一个 Random 对象来获取一个随机数生成器,然后在该实例上调用 NextDouble()。例如:
  • 数字在下界 0.0 处是包含的,在上界 1.0 处是不包含的。
  • 它有助于生成随机双精度数,常用于概率 模拟、游戏、统计抽样 以及其他需要 0 到 1 之间数字的应用。

语法

调用 NextDouble() 方法的语法是:

其中

random 是 System.Random 类的实例。

例如

分解一下:

  • 首先,创建一个 Random 类的实例,通常是通过实例化一个新的 Random 对象。
  • 然后,在该 Random 实例上调用 NextDouble() 方法。
  • 该方法不接受任何参数。
  • 每次调用时,它都会返回一个双精度浮点数。

因此,最简单的形式是,您只需要一个 Random 对象实例,并在该实例上调用 NextDouble() 来生成一个介于 0.0 和 1.0 之间的随机双精度数。

以下是 Random.NextDouble() 返回值的示例说明:

返回值

NextDouble() 方法返回一个介于 0.0 和 1.0 之间(包括 0.0,不包括 1.0)的随机双精度浮点数值。具体来说:

  • 返回类型为 double。
  • 返回的最小值是 0.0(包含)。
  • 返回的最大值是 0.999999999...(不包含)。

这意味着可以返回 0.0,但值永远不会达到 1.0。一些有效返回值的示例:

以及一些超出范围的无效示例:

随机数生成

NextDouble() 返回的随机数是伪随机的,而不是真正的随机。这意味着会使用一个算法来生成看起来随机但基于初始种子值确定的数字。

具体来说,.NET Random 类使用 Donald E. Knuth 的减法随机数生成器算法来生成随机数。虽然这些数字不是加密安全的随机数,但对于统计抽样、游戏和建模来说,它们提供了足够的随机性。

伪随机数生成的一个优点是,如果使用相同的种子值初始化 Random 实例,就可以重现特定的随机数序列。这允许在测试时重现“随机”数字序列。

种子(Seeding)

Random 类使用的伪随机数生成器必须初始化一个数字来启动生成序列。这个初始数字称为“种子值”。

您可以通过将值传递给 Random 构造函数来设置种子。例如:

每次调用 NextDouble() 时,都会根据种子值 100 生成一个可预测的序列。

如果您不指定种子,系统将自动使用时钟的刻(ticks)作为种子。默认情况下,这会导致每次生成不同的序列。

例如

// 默认使用系统时钟时间作为种子

因此,通过设置您的种子,您可以在之后重现相同的“随机”数字序列,用于测试或其他目的。省略种子会导致每次运行生成的数字看起来更随机,但不可重现。

用途

下面是一个演示 Random.NextDouble() 方法的 C# 程序:

输出

0.93446842991629 
0.40405848811062 
0.01550833958745
0.24640493381201
0.58781033379141
0.01755845513006
0.35399442845324 
0.88319083814947
0.98500852443907
0.13854155292240

说明

如您所见,每次调用 NextDouble() 都会返回一个新的介于 0.0 和 1.0 之间的随机双精度数。它为在 C# 中生成随机双精度数提供了一种简单的方法。每次运行看到的数字似乎是随机的,但实际上使用了伪随机算法。

以下是对 Random.NextDouble() 返回的上下界的包含性的解释:

包含性(Inclusivity)

NextDouble() 返回的伪随机双精度数范围可以从 0.0 开始,直到但不包括 1.0。具体来说:

  • 下界:0 是包含的。
    1. 这意味着可以返回 0.0。
    2. 例如 0.0、0.0001 和 0.5 都是有效值。
  • 上界:0 是不包含的。
    1. 永远不会返回 1.0。
    2. 999999 是可能达到的最高值(近似)。
    3. 值永远小于 1.0。

因此,如果在 0.0 到 1.0 的数轴上可视化,范围将如下所示:

0.0 [?????????????????????] 1.0

包含 不包含

其中 1.0 永远不会被达到,但范围可以任意接近 1.0 而不实际返回它。

这使得该方法可以均匀地返回 0 到略小于 1 之间的任何双精度值。上界的排他性使得能够对概率、模拟以及不需要正好是 1.0 的情况进行建模。

Random.NextDouble() 方法的应用

  1. 游戏 - 生成随机数对于诸如伤害计算、随机事件、洗牌、掷骰子等非常有用。
  2. 模拟 - NextDouble() 可用于各种概率模拟,您需要在其中模拟随机性,从疾病模型到物理模拟。
  3. 采样 - 可用于统计抽样,从更大的总体中选择随机样本以进行估计。
  4. 测试 - 伪随机值可用于通过将随机性注入测试数据来测试代码。
  5. 密码学 - 单纯的随机性对加密来说是不安全的,但当与加密算法结合使用时仍然很有用。
  6. 金融 - 随机行为建模适用于某些金融模型、模拟和分析。
  7. 赌博 - 任何与机会游戏相关的应用都高度依赖于高质量的随机数生成。
  8. 动画/图形 - 通过扰动和运动为动画添加随机性可以获得更真实的结果。

结论

总而言之,任何需要生成随机数、双精度值、概率分布或不可预测行为的应用都可以受益于 Random.NextDouble() 的简洁性和质量。