Página 2 de 2

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

Enviado: 07 Ago 2020 17:04
por JoséQuintas
Então parece que aquela rotina de gerar um número de cada vez pode ser a mais adequada.

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

Enviado: 07 Ago 2020 18:22
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.

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

Enviado: 07 Ago 2020 18:47
por alxsts
Olá!

Provavelmente trocando o uso de arrays pelo de hashes torne o processo mais rápido

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

Enviado: 03 Set 2020 11:07
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

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

Enviado: 20 Set 2020 20:03
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



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

Enviado: 20 Set 2020 21:21
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

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

Enviado: 20 Set 2020 21:24
por Vlademiro
Eduardo, essa sua da certo tb, é o mesmo princípio.

Valeu.