Fórum Gerar um número único #274856
31/03/2005
0
Sugestões?
Grato!
Vitor Rubio
Curtir tópico
+ 0Posts
31/03/2005
Motta
20050331131141375
meio bizarro, mais difícil repetir
Gostei + 0
31/03/2005
Vitor Rubio
Gostei + 0
31/03/2005
Motta
2) No Oracle tem uma function Sysdate que retorna a data/hora (até seg), creio que no IB tenha algo assim , mas creio que pode ser a data da máquina local.
3) Ib tem um objeto chamado generator (creio) que gera uma sequencia sem repetição
Gostei + 0
31/03/2005
Vitor Rubio
Gostei + 0
31/03/2005
Motta
gere um valor ramdomico
para um tamanho de 8 - 2821109907456
10 - 3656158440062976
16 - 7958661109946400884391936
a chance de colisão é mínima (ao não ser que seja para cadastrar cpf de chineses ...)
sendo case sensitive (26+26+10)
16 - 47672401706823533450263330816
Gostei + 0
31/03/2005
Vitor Rubio
mesmo assim achei interessante a sua outra ideia.
Não entendi esses números que vc colocou: são exemplos dos números gerados e a quantidade de dígitos ou é a quantidade de possibilidades que dá pra fazer com as 26 letras e 10 dígitos? como se implementaria essa função?
Gostei + 0
31/03/2005
Motta
exemplo para gera números :
procedure TForm1.SpeedButton1Click(Sender: TObject); var i,j,max:integer; s,str:string; begin Randomize; if CheckListBox1.Checked[0] then str:= ´1234567890´; if CheckListBox1.Checked[1] then str:=str + ´ABCDEFGHIJKLMNOPQRSTUVWXYZ´; if str = ´´ then begin showmessage(´escolha um ao menos !!´); exit; end; RichEdit1.Lines.Clear; for j:=1 to SpinEdit1.Value do begin s:=´´; max:= 6 + random(8); for i:=1 to max do s:= s + str[random(length(str))+1]; RichEdit1.Lines.Add(s); end; end;
Gostei + 0
01/04/2005
Vitor Rubio
Gostei + 0
01/04/2005
Michael
Talvez haja uma solução menos trabalhosa e mais eficiente para o seu problema. Vamos lá:
O Delphi possui a função [b:9d1c42ef5c]Random[/b:9d1c42ef5c], que retorna um número aleatório baseado na hora interna da BIOS - como ele faz isso é irrelavante aqui. É claro que vc não poderia simplesmente chamar Random pois os números seriam passíveis de repetição. E aí que entra a variável global [b:9d1c42ef5c]RandSeed[/b:9d1c42ef5c]. Como o próprio nome diz, ela alimenta o gerador randômico da função Random. RandSeed é inicializada apenas uma vez quando um aplicativo Delphi é carregado, portanto, todas as chamadas a Random retornarão o mesmo valor. Para contornar isso, também há a procedure [b:9d1c42ef5c]Randomize[/b:9d1c42ef5c], que trata de alterar os valores de RandSeed, dando a Random um caráter aleatório de fato.
Bom, Randomize insere vários valores em RandSeed, repetidos ou não. Se vc, manualmente, inserir sempre o mesmo valor, então Random também irá retornar sempre o mesmo valor.
De qualquer forma não há nada automático. Vc teria que criar um valor - usando uma lógica como a do colega Motta - e inserí-lo em RandSeed. Depois, Random faz o resto.
Quanto a retornar a data do servidor de banco de dados, pesquise no fórum por ´data servidor´. Tem muitas soluções lá
Mas teste minha idéia. Talvez ela não se encaixe em seu caso.
Abraços!
Gostei + 0
01/04/2005
Gandalf.nho
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
Gostei + 0
01/04/2005
Motta
Ainda acho que um objeto como a sequence é mais simples.
Gostei + 0
01/04/2005
Beppe
Gostei + 0
01/04/2005
Michael
[]´s
Gostei + 0
01/04/2005
Beppe
Michael, se vc tiver interesse sobre como funciona o gerador de números aleatórios no Delphi, escrevi um artigo sobre o assunto: http://www.forumweb.com.br/artigos/artigos.php?action=file&id=291
Também há uma discussão sobre o mesmo: http://www.forumweb.com.br/foruns/index.php?showtopic=24599&hl=
Em suma, um PRNG deve dar a mesma probabilidade de ocorrência a qualquer número no universo. Se ´sempre crescente´ for uma restrição, a propriedade de randomicidade fica comprometida.
Só uma coisa que não entendi no seu último post...que chave se referia?
Gostei + 0
02/04/2005
Michael
Olá Beppe!
Com certeza irei dar uma olhada nos links que vc falou.
A minha idéia é de que os números aleatórios fossem sempre maiores que os anteriores. Por isso disse ´crescente´. Tipo, 1, 4, 6, 9, 18 etc.
A chave que eu disse é a variável global RandSeed, que controla como Random funciona.
[]´s
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)