nro aleatorio dentro de uma faixa

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

narlem
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 24 Set 2004 14:34

nro aleatorio dentro de uma faixa

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

nro aleatorio dentro de uma faixa

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

nro aleatorio dentro de uma faixa

Mensagem 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)
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: nro aleatorio dentro de uma faixa

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: nro aleatorio dentro de uma faixa

Mensagem 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+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: nro aleatorio dentro de uma faixa

Mensagem 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:

Código: Selecionar todos

nReg := (Int(Rand() * 1000000) % nLimite) + 1
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: nro aleatorio dentro de uma faixa

Mensagem por asimoes »

No xHarbour temos a função HB_Random(nMin, nMax)

GOTO Int( HB_Random( 1, Reccount() ) )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: nro aleatorio dentro de uma faixa

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Re: nro aleatorio dentro de uma faixa

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: nro aleatorio dentro de uma faixa

Mensagem por alxsts »

Uso esta função que segue em anexo. Tem me ajudado. Peguei em algum lugar na net.

{||}s
AlxSts
Anexos
rand.prg
Função Random()
(1.24 KiB) Baixado 328 vezes
[]´s
Alexandre Santos (AlxSts)
Responder