Página 1 de 1
nro aleatorio dentro de uma faixa
Enviado: 29 Out 2008 15:40
por narlem
Olá,
Estou precisando gerar um numero aleatorio dentro de uma faixa de valores, a necessidade é a seguinte, preciso selecionar alguns registros aleatoriametne dentro de uma arquivo, entao pego o total de registro do arquivo atraves do reccount(), e estou usando o random(), mas nao consigo fazer que o numero aleatorio seja calculado até um determinado numero, por exemplo se o arquivo tem 999 registro, o numero aleatorio deveria ser até 999, mas já tentei "random(999)", mas ele gera um numero acima de 1000, se alguem puder me ajudar, agradeco desde já
Narlem G. A. Santos
nro aleatorio dentro de uma faixa
Enviado: 29 Out 2008 15:56
por Pablo César
Você poderia colocar em looping a função que pega o número aleatório e condicionar a saída desse looping caso esse valor seja n.
Senão me engano ja existe alguma função que trabalha assim, vou procurar caso ache irei disponibilizar-la. Mas esse recurso que indiquei funcionaria.
nro aleatorio dentro de uma faixa
Enviado: 29 Out 2008 16:03
por Pablo César
O código é proveniente da biblioteca GRUMPFISH. Só basta passar o parâmetro limite. Teste e veja se serve.
Código: Selecionar todos
function GFRand(n)
static xrndseed := .123456789
if xrndseed = .123456789
xrndseed += val(substr(time(), 7, 2)) / 100
endif
xrndseed := (xrndseed * 31415821 + 1) / 1000000
return int( (xrndseed -= int(xrndseed)) * n)
Re: nro aleatorio dentro de uma faixa
Enviado: 30 Out 2008 05:16
por Maligno
No lugar do colega eu geraria um número aleatório qualquer, bem grande, e dividiria o valor limite pelo número gerado. Ao resto, se zero, acrescenta-se um. Pronto. Este resultado sempre estará dentro da faixa desejada. Aliás, eu uso a CATools, que é mais popular.
Re: nro aleatorio dentro de uma faixa
Enviado: 30 Out 2008 06:28
por ANDRIL
Ja que vc usa a CATools, tenta este código:
numero=INT(RANDOM()%999 +1)
Coloquei para retornar somente números inteiros, caso queira decimal, tire a função INT().
Ate+,
Re: nro aleatorio dentro de uma faixa
Enviado: 30 Out 2008 08:53
por Maligno
Foi o que sugeri. Mas a função Random() só retorna INT, entre -32768 e 32768. Portanto, não será necessário usar a função Int(). Só que eu usaria a função Rand(), que retorna apenas valores fracionados (grandes) entre 0 e 1. Mas é só multiplicar por 1.000.000, por exemplo. Algo do tipo:
Re: nro aleatorio dentro de uma faixa
Enviado: 30 Out 2008 13:03
por asimoes
No xHarbour temos a função HB_Random(nMin, nMax)
GOTO Int( HB_Random( 1, Reccount() ) )
Re: nro aleatorio dentro de uma faixa
Enviado: 30 Out 2008 13:12
por Maligno
Infelizmente, o caso aqui é Clipper. Pelo menos a seção destino do post faz supor que o OP quer uma solução para Clipper. E, também infelizmente, a CATools não dispõe do mesmo recurso que a biblioteca do XHarbour. Pelo menos que eu saiba. Se bem que esse é o menor dos problemas, dada a simplicidade do código envolvido.
Re: nro aleatorio dentro de uma faixa
Enviado: 31 Out 2008 11:21
por Adalberto
Ola narlem
Considera este código, ¡ funciona !
Código: Selecionar todos
FUNCTION RandInt ( nDesde , nHasta ) // Leiase: nMim , nMax
//
LOCAL nUltimo , nRandom := 0 , nMult := INT( SECONDS() )
LOCAL nNumero := ( nHasta - nDesde )
LOCAL nLen := LEN( ALLTRIM( STR( nNumero ) ) )
SET DECIMAL TO 16
IF ( ( VALTYPE( nUltimo ) <> "N" ) .OR. EMPTY( nUltimo ) )
nUltimo := ( ( nMult * ( ( SECONDS() - INT( SECONDS() ) ) * 100 ) ) % 335544319 )
ENDIF
nUltimo := ( ( nMult * nUltimo ) % 335544319 )
nRandom := VAL( RIGHT( STR( nUltimo / 335544319 ) , nLen ) )
IF ( nRandom > nNumero )
nRandom := ( nNumero - VAL( RIGHT( STR( nRandom ) , LEN( ALLTRIM( STR( nNumero ) ) ) - 1 ) ) )
ENDIF
SET DECIMAL TO 2
RETURN( nDesde + INT( nRandom ) )
Um grande abrazo.
Re: nro aleatorio dentro de uma faixa
Enviado: 13 Nov 2008 18:35
por alxsts
Uso esta função que segue em anexo. Tem me ajudado. Peguei em algum lugar na net.
{||}s
AlxSts