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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 568
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: 3109
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