RANDOMIZE
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgRandomize
- 最后更新: 2022-04-14
为随机数生成器设置种子
语法
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
'' 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
Nextend 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 方言中设为默认)。
参见
Rnd- 语言方言
返回 目录