Artigo: 231847 - Última revisão: quinta-feira, 24 de Junho de 2004 - Revisão: 3.0

INFO: Como Visual Basic gera Pseudo-Random números para a função RND

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

A função RND no Visual Basic gera números pseudo-aleatória, consoante um algoritmo específico. Para determinados estudos científicos ou estatísticos poderá ser importante compreender como estes números são gerados. Este artigo documenta o algoritmo utilizado.

Um treatise completo sobre a natureza estatística este algoritmo é fora do âmbito deste artigo, mas o tópico amplamente discutido a literatura científica.

Mais Informação

Microsoft Visual Basic utiliza o método linear congruential para geração de número pseudo-aleatória na função RND. O seguinte código pseudo documenta o algoritmo utilizado:
   x1 = ( x0 * a + c ) MOD (2^24)
				
onde:

x 1 = novo valor
0 x = valor anterior (um valor inicial de 327680 é utilizado pelo Visual Basic)
um = 1140671485
c = 12820163

O operador 'MOD' na fórmula acima devolve o resto do número inteiro após uma divisão de número inteiro.

A expressão x1/(2^24) devolverá o número de vírgula flutuante entre 0,0 e 1,0 devolvido pela função RND.

Tenha em atenção que o algoritmo acima não pode ser implementado no código do Visual Basic de tal forma que a sequência de número aleatória gerada pela função RND poderem ser reproduzida. Isto deve-se ao facto de internamente do Visual Basic utiliza um tipo de dados longo não assinado que não é suportado pela linguagem do Visual Basic.

O código de C/C ++ seguinte pode ser utilizado para gerar os primeiros dez números pseudo-aleatória que gera o 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;
}
				
nota que, por predefinição, o Rnd() função devolverá a mesma sequência de pseudo-aleatória numera cada tempo o programa é executada. Para alguns efeitos (tais como estatísticos estudos onde é necessário repeatability) pode ser adequado. Para outros tipos de aplicações, tais como jogos, este poderá não ser adequado. Se for necessária uma sequência diferente, utilize a instrução Randomize anterior para a primeira chamada para Rnd(). Isto irá inicializar a propagação de número aleatória utilizando o temporizador do sistema. Se uma sequência diferente é necessária, mas tem de ser repeatable no futuro, utilize a sintaxe aleatório X onde X é algum valor numérico específico.

É importante reconhecer que Rnd() devolve uma nova sequência para cada componente em que é utilizada; ou seja, se o EXE principal gera uma sequência e utiliza uma DLL de ActiveX do Visual Basic para gerar uma sequência também, estas sequências são independentes de um do outro.

Referências

Para obter informações adicionais sobre como versões anteriores do Microsoft Basic gerar números pseudo-aleatória, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
28150  (http://support.microsoft.com/kb/28150/EN-US/ ) RND e RANDOMIZE alternativas para gerar números aleatórios
Vários algoritmos de numéricos para gerar sequências numéricas pseudo-aleatória podem ser encontrados na Internet e em publicado textos relativos algoritmos numéricos.

A informação contida neste artigo aplica-se a:
  • 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 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbmt kbinfo KB231847 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 231847  (http://support.microsoft.com/kb/231847/en-us/ )