A função Random em ASP (Rnd) gera números aleatórios, bem como o método Math.Random faz o mesmo em javascript. No entanto, para fins de auditoria, é preciso explicitar qual o algoritmo que existe por trás do cálculo dos números aleatórios obtidos.
Para esta finalidade, temos um método totalmente transparente, desde a semente de número aleatório utilizada, expressa no código abaixo:
<style>
SPAN.vm { color:red; }
</style>
<%
NO_MAX = 80
QtNoGerar = 12
'* Declarações de variáveis
Dim RaizNumeroAleatorio
Dim DtHoje, Agora
Dim Dia, Mes, Ano, Hora, Minuto, Segundo
Dim sNUMERO_ALEATORIO,NUMERO_ALEATORIO
Dim intNoAleat
Dim Arranjo()
ReDim Arranjo(QtNoGerar)
'* Obtenção parâmetros raiz
DtHoje = Date()
Agora = Time()
'* Obtenção fragmentos de parâmetros
Ano = year(DtHoje):Mes = Month(DtHoje):Dia = Day(DtHoje)
Hora = Hour(Agora):Minuto = Minute(Agora):Segundo = Second(Agora)
'* Concatena parâmetros de data e hora
if Application("PSpca_RandomDec") = "" then
RaizNumeroAleatorio = CDbl(Segundo&Dia&Mes&Ano&Hora&Minuto)
RaizNumeroAleatorio = RaizNumeroAleatorio + 3.141592653589
else
RaizNumeroAleatorio = CDbl(Application("PSpca_RandomDec"))
end if
Response.write("Raiz Inicial: "&RaizNumeroAleatorio)
%>
<table border=1 cellspacing=0>
<th>Indice<th>Pré-Expoente<th>Matriz<th>Matriz<sup>8</sup><br>(Parte fracionária)<th>Número Sorteado<th>STATUS
<%
j = 0
Do while j < QtNoGerar
'* 1 - Exibe a Raiz do número aleatório modificada
Response.write("<tr><td align=right>"&CStr(j)&"<td align=right>"&RaizNumeroAleatorio)
intNoAleat = CDbl(FormatNumber(CStr(RaizNumeroAleatorio),0))
'* 2 - RETIRA A PARTE FRACIONÁRIA
NUMERO_ALEATORIO = RaizNumeroAleatorio - intNoAleat
'* 3 - SOMA UM PARA QUE O NUMERO PRODUZIDO NÃO REDUZA CADA VEZ MAIS A MANTISSA (tendendo ao valor zero)
NUMERO_ALEATORIO = NUMERO_ALEATORIO + 1
'* 4 - Exibe o número aleatório produzido
Response.write("<td align=right>"&NUMERO_ALEATORIO)
'* 5 - Eleva a matriz ao expoente 8
NUMERO_ALEATORIO = NUMERO_ALEATORIO ^ 8
'* 6 - PARTE INTEIRA
intSorteio = CDbl(FormatNumber(CStr(NUMERO_ALEATORIO),0))
'* 7 - Devido a erros de arredondamento, a subtração pode ficar ligeiramente negativa, portanto é retirado o sinal
Sorteio = Abs(NUMERO_ALEATORIO - intSorteio)
'* 8 - Exibe o número sorteado (parte fracionária)
Response.write("<td align=right>"&Sorteio)
'* 9 - Multiplica a mantissa pelo número limite de Sorteio, e soma 1, para evitar que o número sorteado seja 0 (zero)
sSorteio = FormatNumber(CStr(Sorteio * NO_MAX)+1,0)
'* 10 - Exibe o número Sorteado em formato inteiro
Response.write("<td align=right>" & sSorteio & "")
'* 11 - Guarda a mantissa como próxima raiz de número aleatório
RaizNumeroAleatorio = Sorteio 'NUMERO_ALEATORIO
JaExiste = (0=1)
'* 12 - Checa se o número sorteado já foi gerado anteriormente
for i = 1 to j
if sSorteio = Arranjo(i) then
JaExiste = (0=0)
i = QtNoGerar
end if
next
if JaExiste then
JaExiste = "<span class=Vm>JaExiste</span>"
else
j = j + 1
Arranjo(j) = sSorteio
JaExiste = ""
end if
'* 13 - Exibe o Status do número gerado (Se ja existe ou não)
Response.write("<td align=right>"&JaExiste)
loop
%>
</table>
<%
Application("PSpca_RandomDec") = CStr(RaizNumeroAleatorio)
%>
Os números são gerados até que alcancem o número de números pedidos, SEM QUE NENHUM SE REPITA.
Nenhum comentário:
Postar um comentário