Skip to content

RANDOMIZE


为随机数生成器设置种子

语法

declare sub Randomize ( byval seed as double = -1.0, byval algorithm as long = 0 )

用法

Randomize [ seed ][, algorithm ]

参数

seed

随机数生成器的 double 种子值,但除算法 #4 外,所有算法的小数部分都会被截去(见下文)。如果省略,将使用基于 Timer 的值代替。

algorithm

用于选择算法的整数值(可用算法见标准头文件 "fbprng.bi")。如果省略,将使用当前语言方言的默认算法。

说明

设置帮助 Rnd 生成随机数的随机种子,并选择要使用的算法。

algorithm 的常量在 fbprng.bi 中定义。在 -lang fb 方言中,这些常量是 FB 命名空间的一部分。

algorithm 的有效值为:

FB_RND_AUTO (0) - 当前语言方言的默认值。在 -lang fb 方言中为算法 FB_RND_MTWIST (3),在 -lang qb 方言中为 FB_RND_QB (4),在 -lang fblite 方言中为 FB_RND_CRT (1)

FB_RND_CRT (1) - 使用 C 运行时库的 rand() 函数。不同平台的结果可能不同。

FB_RND_FAST (2) - 使用快速实现。应在所有平台上保持稳定,提供 32 位精度和合理的随机程度。

FB_RND_MTWIST (3) - 使用 Mersenne Twister。应在所有平台上保持稳定,提供 32 位精度和高度的随机性。

FB_RND_QB (4) - 使用旨在产生与 QBASIC 相同随机数序列的函数。应在所有平台上保持稳定,提供 24 位精度,随机程度较低。

FB_RND_REAL (5) - 在 Win32 和 Linux 上可用,使用系统特性(Win32 Crypto API、Linux /dev/urandom)提供密码学安全的随机数。如果这些系统 API 不可用,将使用算法 FB_RND_MTWIST (3) 代替。

对于任何给定的种子,每种算法都会为该种子产生特定的、确定性的数字序列。如果希望每次调用 Randomize 都产生不同的数字序列,应使用不太可预测的种子——例如,Timer 返回的值。省略 seed 参数将使用基于此的值。

注意:对于除算法 #4 以外的所有算法,由于种子的小数部分会被截去,直接使用 Timer 值作为参数在同一秒内多次使用将产生相同的种子。但是,通常不值得用不可预测的种子两次调用 Randomize,因为第二个序列并不比第一个更随机,甚至可能因引起序列重叠而更差。在大多数情况下,Mersenne Twister 应能提供足够随机的数字序列,无需在 Rnd 调用之间重新设置种子。

当使用 QB 兼容算法调用 Randomize 时,会保留一部分旧种子。这意味着如果多次以相同的种子调用 Randomize,每次不会得到相同的序列。要在 QB 兼容模式下获得特定序列,请通过以负数参数调用 Rnd 来设置种子。

注意:

Randomize 是线程安全的(通过使用内部互斥锁),但不是线程特定的。

标准头文件 "fbprng.bi" 中还提供了其他随机数生成器的未完成结构。

示例

start GeSHi

vb
'' Seed the RNG to the method using C's rand()
Randomize , 1

'' Print a sequence of random numbers
For i As Integer = 1 To 10
    Print Rnd
Next

end GeSHi

版本

  • fbc 1.10.0 之前(fbc 1.08.0 和 fbc 1.09.0),"fbprng.bi" 被命名为 "fbmath.bi"。
  • fbc 1.08.0 之前:

方言差异

使用的默认算法取决于当前使用的方言:

  • 使用 -lang fb 方言时,使用 32 位粒度的 32 位 Mersenne Twister 函数。
  • 使用 -lang qb 方言时,使用产生与 QB 中 Rnd 相同输出的函数。粒度为 24 位。
  • 使用 -lang deprecated-lang fblite 方言时,使用系统中可用的 C 运行时函数。Win32 中的函数粒度为 15 位,Linux 和 DOS 中为 32 位。

与QB的区别

  • algorithm 参数是 FreeBASIC 新增的。
  • QBASIC 只有一种算法(在 FB 中以算法编号 4 复制,并在 -lang qb 方言中设为默认)。

参见

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系