The Wayback Machine - https://web.archive.org/web/20110311091327/http://support.microsoft.com:80/kb/231847/zh-cn
文章编号: 231847 - 最后修改: 2004年6月24日 - 修订: 3.0

信息: 如何 Visual Basic 生成 Pseudo-Random 编号为 RND 函数

概要

在 Visual Basic RND 函数生成伪随机数,根据到特定算法。对于某些科学或统计研究可能需要首先了解如何生成这些数字。本文介绍所使用的算法。

此算法的统计性质的完整 treatise 超出了本文的范围,但在科学文献中广泛讨论主题了。

更多信息

Microsoft Visual Basic 中使用为 RND 函数中的伪随机编号生成线性 congruential 的方法。下面的伪代码文档所使用的算法:
   x1 = ( x0 * a + c ) MOD (2^24)
				
位置:

x 1 = 新值
x 0 = (初始值 327680 使用的 Visual Basic) 的前一个值
一个 = 1140671485
c = 12820163

在上述公式中的 MOD 运算符返回后一个整数除法的整数余数。

表达式 x1/(2^24) 然后将返回介于 0.0 和 1.0 RND 函数所返回的浮点数。

请注意无法在这种方式可以重现 RND 函数由生成随机编号规则中的 vba 代码中实现上述算法。这是因为 Visual Basic 在内部使用一个无符号长数据类型 Visual Basic 语言不受支持的。

下面的 C/c + + 代码可用于生成前十个 Visual Basic 生成的伪随机数字:
#include "stdafx.h"

int main(int argc, char* argv[])
{
unsigned long       rndVal;

rndVal = 0x50000L;
int i;
float rndFloat;

for (i=0;i<10;i++)
	{
	rndVal = (rndVal * 0x43fd43fdL + 0xc39ec3L) & 0xffffffL;
	rndFloat = (float)rndVal / (float)16777216.0;
	printf("Value is %.15f\n",rndFloat);
	}
return 0;
}
				
笔记,默认状态下,该 Rnd() 函数将返回相同序列的伪随机数字,每个时间在程序运行。对于某些目的 (例如需要 repeatability 的统计研究),这可能是适当。对于其他类型的游戏,如的应用程序这可能是不适当。是否需要不同的顺序使用 Randomize 语句,以在第一次调用 Rnd() 之前。这将通过使用系统计时器初始化随机数字的种子。如果不同的顺序是必需的但在将来必须是可重复,使用 Randomize X 的语法其中 X 是一些特定的数字值。

识别 Rnd() 返回为使用它的每个组件的新序列,请务必 ; 也就是如果您的主 EXE 生成一个序列,并使用 Visual Basic ActiveX DLL 还生成一个序列,这些序列是相互独立。

参考

有关如何更早版本的 Microsoft Basic 的其他信息生成伪随机数,请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
28150  (http://support.microsoft.com/kb/28150/EN-US/ ) RND 和 $ RANDOMIZE 替代方案,用于生成随机编号
在 Internet 上并在已发布的文本与数字的算法,可以找到各种数字的算法,用于生成伪随机编号规则。

这篇文章中的信息适用于:
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 4.0 标准版
  • Microsoft Visual Basic 4.0 专业版
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic 5.0 学习版
  • Microsoft Visual Basic 6.0 学习版
  • Microsoft Visual Basic 5.0 专业版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 5.0 企业版
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
关键字: 
kbmt kbinfo KB231847 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 231847  (http://support.microsoft.com/kb/231847/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。