ID do artigo: 231847 - Última revisão: quinta-feira, 24 de junho de 2004 - Revisão: 3.0

INFO: Como Visual Basic gera números Pseudo-Random 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 | Recolher tudo

Sumário

A função RND no Visual Basic gera números pseudo-aleatórias de acordo com um algoritmo específico. Para determinados científicos ou estatísticos estudos pode ser importante entender como esses números serão a geração. Este artigo documenta o algoritmo usado.

Um treatise completo sobre a natureza estatística desse algoritmo é além do escopo deste artigo, mas o tópico é discutido amplamente na literatura científica.

Mais Informações

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

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

O operador 'MOD' na fórmula acima retorna o resto inteiro após uma divisão.

X1/(2^24) expressão, em seguida, retornará o número de ponto flutuante entre 0,0 e 1,0 retornado pela função RND.

Observe que o algoritmo acima não pode ser implementado no código do Visual Basic de tal forma que a seqüência de número aleatória gerada pela função RND pode ser reproduzida. Isso acontece porque internamente Visual Basic usa um tipo de dados longo não assinado que não é suportado pela linguagem Visual Basic.

O seguinte código C/C ++ pode ser usado para gerar os dez primeiros números pseudo-aleatórias que gera do 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;
}
				
Observação que, por padrão, Rnd() função retornará a mesma seqüência de pseudo-aleatória números de cada vez o programa é executada. Para algumas finalidades (como estudos estatísticas onde é necessária repetição) pode ser apropriado. Para outros tipos de aplicativos, como jogos, isso pode não ser apropriado. Se uma seqüência diferente for necessária, use a instrução Randomize antes para a primeira chamada para Rnd(). Isso irá inicializar a propagação de número aleatória usando o timer do sistema. Se uma seqüência diferente é necessária, mas deve ser repetida no futuro, use a sintaxe Randomize X onde X é alguns valor numérico específico.

É importante reconhecer que Rnd() retorna uma nova seqüência para cada componente em que é usado; ou seja, se o EXE principal gera uma seqüência e usa uma DLL de ActiveX do Visual Basic para gerar uma seqüência também, essas seqüências são independentes entre si.

Referências

Para obter informações adicionais sobre como versões anteriores do Microsoft Basic gerar números pseudo-aleatórias, clique no número abaixo para ler 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
Diversos algoritmos numéricos para gerar pseudo-aleatórias de seqüências numéricas podem ser encontrados na Internet e em textos publicados referentes a 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 de 16 bits Enterprise Edition
  • Microsoft Visual Basic 4.0 de 32 Bits 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )