Ladinilson Posted August 7, 2020 Report Share Posted August 7, 2020 Fiz vários testes com nRANDOM(), RANDOM(), HB_RandomInt(), etc e todas elas NÃO FUNCIONARAM nas suas totalidades ou seja, todas deixaram de fornecer alguns números em uma de range 999999 e estou com muita dificuldade em encontrar uma solução para isso já que em se tratando de sorteios, nenhum número pode faltar ou se repetir. Algum de vocês tem alguma rotina própria criada para esta função que eu consiga testar? Obrigado Quote Link to comment Share on other sites More sharing options...
kapiaba Posted August 7, 2020 Report Share Posted August 7, 2020 Veja se ajuda: https://medium.com/trainingcenter/o-que-é-uuid-porque-usá-lo-ad7a66644a2b #include "FiveWin.ch" function main() ? random_uuid() return nil function random_uuid() local cMask := 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' local cStringHex := '0123456789abcdef-', x local cUUID := '', i, cCaracter for x := 1 to Len( cMask ) i := Int( hb_Random( 0, 0xffff ) % 16 ) cCaracter := SubStr( cMask, x, 1 ) if cCaracter == 'x' cUUID += SubStr( cStringHex, i, 1 ) elseif cCaracter == 'y' cUUID += SubStr( cStringHex, HB_BitOr( HB_BitAnd( i, 0x03 ), 0x08 ), 1 ) else //- e 4 cUUID += cCaracter endif next return cUUID /* function main 2 ? win_UuidCreateString() 3 return nil 4 >hbmk2 uuid.prg hbwin.hbc 5 */ Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted August 7, 2020 Author Report Share Posted August 7, 2020 Obrigado Kapi mas vi que utilizou a hb_random() e esta testei também. Fiz um DBF de 1 até 999999 e pedi para essas funções encontrarem TODOS os números, algumas não encontraram 30 números e outras uns 7 e para quem trabalha com rifas e jogos de bingo, isso é muuuito. Quote Link to comment Share on other sites More sharing options...
emotta Posted August 8, 2020 Report Share Posted August 8, 2020 Ladinilson, temos que separar as coisas: O propósito das funções randomicas é gerar numeros aleatórios e não gerar todos os numeros que você precisa. Ou seja, se fizermos assim: For nI := 1 to 100 ? HB_RandomInt(100) Next Se esse código for executado ele vai gerar vários números repetidos e não gerar todos os numeros de 1 até 100 só pq vc executou 100x a função. Então se você precisa de uma função que vá gerando numeros aleatórios e conforme for gerando os retire da lista para não os gerar novamente terá que fazer uma. O propósito da função que gera números aleatórios é outro, é simplesmente gerar números aleatoriamente e isso implica até que algumas vezes o próximo numero aleatório seja o mesmo já gerado recentemente. Se explicar melhor o que você está precisando posso tentar desenvolver uma de acordo com o que precisa mas dizer que as funções HB_RANDOM não funciona você está enganado, uso a muitos anos sem qualquer problema. Quote Link to comment Share on other sites More sharing options...
emotta Posted August 8, 2020 Report Share Posted August 8, 2020 Acho que entendi o que você quer, fiz uma função para sortear os números pra você e todos são sorteados... E usando a HB_RandomInt.... E funcionando, pode testar... // funcao que faz o sorteio // para utilizar primeiro é preciso definir o range e depois é só ir executando MySorteio sem passar qualquer parametro. Quando a funcao retornar 0 indica que os numeros a serem sorteados acabaram Function u_Teste() Local cTexto := "" Local cFile := "numeros.txt" Local nSort MySorteio(.t.,100) // aqui inicia o sorteio considerando o range de 1 até 100 While (nSort:=MySorteio())<>0 cTexto+=AllTrim(Str(nSort))+Chr(13)+Chr(10) EndDo MemoWrit(cFile,cTexto) WinExec("notepad "+cFile) Return Function MySorteio(lInit,nTotal) Local nI Local nRet := nil Local nNum Local nSort := 0 Static aNumeros If lInit == nil lInit := .f. EndIf If lInit // inicia array com numeros a serem sorteados aNumeros := Array(nTotal) For nI := 1 to Len(aNumeros) aNumeros[nI] := nI Next Else If ValType(aNumeros) == "A" .and. Len(aNumeros) > 0 nNum := HB_RandomInt(Len(aNumeros)) nSort := aNumeros[nNum] aDel(aNumeros,nNum,.t.) EndIf EndIf Return nSort Quote Link to comment Share on other sites More sharing options...
emotta Posted August 8, 2020 Report Share Posted August 8, 2020 Ladinilson outra coisa, em vez de fazer um programa pra conferir os numeros sorteados pegue o txt que o meu exemplo gera, cole no excel e mande ordenar do menor para o maior e ai nas linhas vc vai conferindo a sequencia, bem mais fácil e eficiente. abraços Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted August 9, 2020 Author Report Share Posted August 9, 2020 4 horas atrás, emotta disse: Ladinilson outra coisa, em vez de fazer um programa pra conferir os numeros sorteados pegue o txt que o meu exemplo gera, cole no excel e mande ordenar do menor para o maior e ai nas linhas vc vai conferindo a sequencia, bem mais fácil e eficiente. abraços Isso mesmo meu caro, para isso foi criada ARRAY para deixar todos os números disponíveis de 0 a 999999 e dentro de um FOR...NEXT, foça a função a fazer todos os números. Não expliquei direito mesmo e o intuito é pegar TODOS os números pois se trata de rifas com 6 digitos, portanto funcionou assim como neste teste... function RandomList() local aList := Array( 999999 ) local nAt, aRandom := {} AEval( aList, { |u,i| aList[ i ] := i } ) do while Len( aList ) > 0 nAt := HB_RandomInt( 1, Len( aList ) ) AAdd( aRandom, aList[ nAt ] ) ADel( aList, nAt, .t. ) enddo XBROWSER aRandom SHOW RECID return nil Que se parece muito com a sua sugerida. Obrigado Quote Link to comment Share on other sites More sharing options...
emotta Posted August 9, 2020 Report Share Posted August 9, 2020 legal, que bom que funcionou e que a HB_RANDOMINT funciona bem. abraços Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.