Funções "RANDOM" não funcionam!

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Funções "RANDOM" não funcionam!

Mensagem por JoséQuintas »

Então parece que aquela rotina de gerar um número de cada vez pode ser a mais adequada.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Funções "RANDOM" não funcionam!

Mensagem por Claudio Soto »

Si es lo mas seguro, porque a pesar que en C:
float : 7 dígitos de precisión decimal
double : 15 dígitos

Hay diferentes funciones para generar números pseudoaleatorios y hay que ver si la función realmente recorre todo el espectro de presicion decimal o entra en un loop más o menos infinito y luego de una determinado número de cálculo vuelve a empezar del inicio de la serie.

Se llaman pseudoaleatorios porque no son verdaderamente aleatorios, siempre la funcion parte de un valor inicial y si siempre se da el mismo valor inicial ("semilla") siempre arroja la misma secuencia de números.
Generalmente como semilla se usa la hora y la fecha actual del sistema en segundos o milisegundos para asegurarse que la secuencia de números sea diferente en cada corrida.
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Funções "RANDOM" não funcionam!

Mensagem por alxsts »

Olá!

Provavelmente trocando o uso de arrays pelo de hashes torne o processo mais rápido
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Funções "RANDOM" não funcionam!

Mensagem por Linguagemclipper »

Eu uso a seguinte função para gerar números aleatórios para nomes de arquivos temporários:

Código: Selecionar todos

function Ran( nLimite )
  static nGuarda:= 1

  local I
  local nResult

  if ValType( nLimite ) # [N]
    nLimite:= 100
  endif

  I:= Seconds()

  while nLimite > I
    I:= I * 100 +Seconds()
  enddo

  nGuarda:= (nGuarda +I) / (nResult:= nGuarda * I % nLimite +1)
  nResult:= Int( nResult )
return nResult
Essa função retorna um número de 0 até o número passado como parâmetro para ela.
Exemplo:

Código: Selecionar todos

cRANDOM  := ALLTRIM(STR(RAN(9999)))
fINDEX   := xTEMP+"TEMP" + cRANDOM
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Funções "RANDOM" não funcionam!

Mensagem por Eduardo Pinho »

Talvez o debate já tenha se encerrado, mas se der tempo, tenho uma funcao aqui que pra mim funciona bem.
Baixei na net nao sei onde, e só fiz adaptacao pra parametros de intervalo.
Fiz muitos testes nela, e nunca vi falha, distribuicao irregular, essas coisas...

Código: Selecionar todos



func RND && ( Min, Max )
* Esta funcao gera um numero aleatorio entre min e max (inclusive).
*
* Returns a floating-point pseudo-random number (PRN) between 0 and maxval
* (left-inclusive), with maxval defaulting to 1. If maxval is in the same
* order of size as the generator's period, the distribution of the
* resulting PRNs will be irregular, but since PERIOD is 2147483647, that
* should not be a problem in practice; people doing astrophysics or monte
* carlo simulation using Clipper deserve everything they get, anyway .
*
* Adaptada para o Harbour com 2 parametros: limite min e maximo,
* mantendo maxval sempre 1.
* Sem os parametros min e max retorna o random como foi gerado.
*
* Esta funcao nao funciona se RND_SEED nao puder ir se modificando a cada chamada.
* Portanto, um executavel gerando um unico PRN e sendo chamado varias vezes em um 
* arquivo BAT, por exemplo, irá gerar uma distruibuicao irregular que em nada se 
* parecerá com numeros aleatorios.
*
* Para gerar numeros aleatorios seguidamente, use esta funcao seguidamente no mesmo 
* executavel.
*

para min,max
private nRandom,nmaxval,range

IF TYPE([RND_PERIOD])#[N]
   PUBLIC RND_PERIOD,RND_FACTOR,RND_SEED
   RND_PERIOD=2147483647
   RND_FACTOR=16807
   rnd_seed = 0
ENDIF

do while rnd_Seed = 0
   rnd_Seed = Seconds()
   rnd_Seed = ( rnd_Seed * 12345 ) % RND_PERIOD
enddo

rnd_Seed = RND_FACTOR * rnd_Seed - Int(RND_FACTOR * rnd_Seed / RND_PERIOD ) * RND_PERIOD

nRandom = (rnd_Seed / RND_PERIOD)

if pcount()=2
   range=max-min+1
   nrandom = int(nrandom*range+min)
endif

RETURN nRandom


Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Funções "RANDOM" não funcionam!

Mensagem por Vlademiro »

Até o momento, a única forma que eu encontrei para garantir a não repetição de valores foi através de uma variável Static.

Static nVal := 0



nValorFinal := hb_randomint(1000,9999) + nVal++

Return nValorFinal
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Funções "RANDOM" não funcionam!

Mensagem por Vlademiro »

Eduardo, essa sua da certo tb, é o mesmo princípio.

Valeu.
Responder