Funções "RANDOM" não funcionam!
Moderador: Moderadores
- JoséQuintas
- 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!
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/
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

- Mensagens: 568
- Registrado em: 27 Ago 2012 12:31
- Localização: Uruguay
- Contato:
Funções "RANDOM" não funcionam!
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.
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.
-
alxsts
- Colaborador

- Mensagens: 3109
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Funções "RANDOM" não funcionam!
Olá!
Provavelmente trocando o uso de arrays pelo de hashes torne o processo mais rápido
Provavelmente trocando o uso de arrays pelo de hashes torne o processo mais rápido
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- Linguagemclipper
- 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!
Eu uso a seguinte função para gerar números aleatórios para nomes de arquivos temporários:
Essa função retorna um número de 0 até o número passado como parâmetro para ela.
Exemplo:
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 nResultExemplo:
Código: Selecionar todos
cRANDOM := ALLTRIM(STR(RAN(9999)))
fINDEX := xTEMP+"TEMP" + cRANDOMUsando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Funções "RANDOM" não funcionam!
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...
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!
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
Static nVal := 0
nValorFinal := hb_randomint(1000,9999) + nVal++
Return nValorFinal
