Randomize
 
种子随机数发生器

语法

Declare Sub Randomize ( ByVal seed As Double = -1.0, ByVal algorithm As Integer = 0 )

用法

Randomize [ seed ][, algorithm ]

参数

seed
随机数生成器的Double种子值。如果省略,将使用基于Timer的值。
algorithm
一个Integer值来选择使用的算法。如果省略,则使用当前语言方言的默认算法。

说明

设置有助于Rnd生成随机数的随机种子,并选择要使用的算法。algorithm 的有效值为:

0 - 当前语言方言的默认值。这是-lang fb 方言中的-lang fb 方言4-lang qb 方言中的3-lang fblite 方言中的1.
1 - 使用C运行时库的rand()功能。这将根据平台给出不同的结果。
2 - 使用快速实现。这在所有平台上应该是稳定的,并提供32位粒度,合理的随机程度。
3 - 使用Mersenne Twister。这应该在所有平台上都是稳定的,提供32位的粒度,并提供高度的随机性。
4 - 使用旨在给出与QBASIC相同的随机数字序列的函数。这应该在所有平台上都是稳定的,并提供24位精度,具有较低的随机性。
5 - 可在Win32和Linux上使用系统功能(Win32 Crypto API,Linux / dev / urandom)提供加密随机数。如果这些系统API不可用,将使用算法3.

对于任何给定的种子,每个算法将产生该种子的特定的,确定性的数字序列。如果您希望每次调用Randomize产生不同的数字序列,则应使用不太可预测的种子 - 例如,从Timer返回的值。省略seed 参数将使用基于此的值。
注意:直接使用Timer值作为参数将产生相同的种子,如果在同一秒内使用多次。然而,无论如何,通常不值得使用不可预测的种子调用Randomize两次,因为第二个序列将不再是第一个序列。在大多数情况下,Mersenne扭转器应提供足够随机的数字序列,而不需要在Rnd调用之间重新进入。


当您使用QB兼容算法调用Randomize时,会保留部分旧种子。这意味着如果您使用相同的种子多次调用Randomize,则每次都将获得相同的序列。要获得QB兼容模式中的特定序列,请使用负参数调用Rnd来设置种子。

例子

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

''打印一系列随机数字
For i As Integer = 1 To 10
    Print Rnd
Next


方言差异

所使用的默认算法取决于当前正在使用的方言:
    • 使用-lang fb 方言,使用32位Mersenne Twister功能,其粒度为32位。
    • 使用-lang qb 方言,在QB中使用与RND相同输出的功能。粒度为24位。
    • 使用-lang deprecated -lang fblite 方言,可以使用系统中可用的C运行时的功能。该函数在Win32中具有15位的粒度,在Linux和DOS中具有32位的粒度。

与QB差别

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

参考