Jump to content
Fivewin Brasil

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


Ladinilson

Recommended Posts

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

 

Link to comment
Share on other sites

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     
*/


Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...