Clipper On Line • Ver Tópico - Funções "RANDOM" não funcionam!

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

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

Moderador: Moderadores

 

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

Mensagempor JoséQuintas » 07 Ago 2020 17:04

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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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

Mensagempor Claudio Soto » 07 Ago 2020 18:22

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
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

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

Mensagempor alxsts » 07 Ago 2020 18:47

Olá!

Provavelmente trocando o uso de arrays pelo de hashes torne o processo mais rápido
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

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

Mensagempor Linguagemclipper » 03 Set 2020 11:07

Eu uso a seguinte função para gerar números aleatórios para nomes de arquivos temporários:
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:
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.
Avatar de usuário

Linguagemclipper
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 214
Data de registro: 16 Abr 2016 17:33
Cidade/Estado: Maceió/AL
Curtiu: 38 vezes
Mens.Curtidas: 12 vezes

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

Mensagempor Eduardo Pinho » 20 Set 2020 20:03

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...



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

Eduardo Pinho
Colaborador

Colaborador
 
Mensagens: 71
Data de registro: 13 Jun 2014 19:30
Cidade/Estado: Niteroi
Curtiu: 2 vezes
Mens.Curtidas: 5 vezes

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

Mensagempor Vlademiro » 20 Set 2020 21:21

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

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

Mensagempor Vlademiro » 20 Set 2020 21:24

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

Valeu.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Anterior



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro