Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola a todos sou novo aqui( pelo menos postando , pois sempre uso esse fórum como tira duvidas :lol:).
Meu nome é Fábio Teixeira e sou um estudante de TI.
Estou desenvolvendo uma área de login semelhante ao que se vê em bancos.
Onde se tem um de teclado digital para a senha(com números e sequencias de letras randomicas).
No geral toda a parte gráfica já está pronta e o sistema de login também.Tudo estava funcionando ate que eu percebi que a sequencia numérica possuia números repetidos.
Desde então venho quebrando a cabeça para consertar isso.
O problema é o segunte:
Criar uma sequencia numérica de 0 a 9 que seja randomica e sem repetir nenhum valor.
Estou usando JavaScript para isso.
// Gera um valor randomico entre ( nim e max )
function rand(min, max) {
return Math.floor((Math.random() * (max - min + 1)) + min);
}
// Verifica se o valor ja existe
function ja_existe(valores,ultimo_valor){
var tamanho = valores.length;
var jaTem = false;
for(var i=0; i < tamanho; i++){
if(valores[i] == ultimo_valor){
jaTem = true;
break;
}
}
return jaTem;
}
var numeros = new Array(10);
var armazena = new Array(10);
for(var i=0; i < 10; i++){
numeros[i] = rand(0,9);
armazena[i] = numeros[i];
if(numeros.length > 1 ){
armazena = armazena.slice(0,armazena.length-1);
while(ja_existe(armazena,numeros[i])){
numeros[i] = rand(0,9);
}
}
}
// apenas para ver o resultado
for(var i=0; i < 10; i++){
alert(numeros[i]);
}
Com isso 2 ou 3 valores acabam se repetindo.
Opitei por usar JavaScript mas se alguem souber sobre algo similar em PHP tambem é de grande ajuda.
Então peço que me ajudem nesse programa ;) .
Desde já agradeço pela atenção.
Obrigado pela dica Beraldo.
Estou usando uma lista agora , mas não consegui reduzir a quantidade de loops( força do vicio :lol: ).
So que agora o numero zero uma vez ou outra é repetido.
<html>
<head>
<script type="text/javascript">
var lista = new Array(0,1,2,3,4,5,6,7,8,9);
var sequencia = new Array();
var armazena = new Array();
var i = 0;
function rand(valMin,valMax)
{
return Math.floor( Math.random() * (valMax - valMin));
}
function gera_sequencia()
{
while(sequencia.length < 10)
{
armazena[i] = rand(0,10);
for(var j=0; j<lista.length; j++)
{
if( armazena[i] == lista[j] )
{
sequencia[i] = armazena[i];
lista[j] = "";
i++;
break;
}
}
}
}
gera_sequencia();
</script>
</head>
<body>
<script type="text/javascript">
for(var i=0; i<sequencia.length; i++)
{
document.write("Posicao: "+i+" . Valor: "+sequencia[i]+"<br />");
}
</script>
</body>
</html>
Vou continuar tentando nao repetir nenhum valor e quando conseguir eu mostro como ficou.
a lista a que me referia é a sua amostra, ou seja, você vai fazer um rand dentro da lista, sorteando apenas o que está lá, como se fosse uma urna de sorteio. Se for sortear dos ganhadores, ao sortear um, você retira o cupom dele, para que não seja sorteado de novo. ;)
um exemplo bem jaguara em Python (fonte seguido de sua execução):
beraldo@orion:/tmp$ cat rand.py
#!/usr/bin/env python
import random;
amostra = range( 0, 10 );
sorteio = [];
print amostra;
random.shuffle( amostra);
print amostra;
for i in range( 0, 5 ):
sorteado = amostra[ random.randint( 0, len( amostra ) - 1 ) ];
print "Sorteado:", sorteado;
sorteio.append( sorteado );
amostra.remove( sorteado );
print sorteio;
beraldo@orion:/tmp$ ./rand.py
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 0, 4, 3, 2, 6, 1, 9, 7, 8]
Sorteado: 7
Sorteado: 5
Sorteado: 8
Sorteado: 0
Sorteado: 4
[7, 5, 8, 0, 4]
Na documentação sobre random há outros exemplos
Beraldo, muito obrigado pela dica.
Eu segui ela e deu certo :lol: .
Realmente, pensar mais orientado a objeto, faz a diferença.
Ficou assim:
Ha uma amostra de numeros(de 0 a 9).
De acordo com o tamanho da amostra é sorteado uma posição dela.
A lista recebe o valor referente à aquela posição da amostra , ao mesmo tempo já é removido da amostra aquele valor.Dessa forma o tamanho da amostra é reduzido e o sorteio da posição dela não vai sortear uma posição que nao exista na amostra.
O processo é repetido até que a lista esteja toda preenchida com os valores da amostra.
No final a lista vai possuir uma sequencia aleatoria com numeros de 0 a 9. :joia:
var amostra = new Array(0,1,2,3,4,5,6,7,8,9);
var lista = new Array();
while( lista.length < 10 ){
// Tamanho da amostra
tamanho = amostra.length;
// Valor aleatorio de acordo com o tamanho da lista
aleatorio = Math.floor( Math.random() * tamanho );
// Lista recebe um valor aleatorio da amostra e tambem o remove da amostra
lista.push( amostra.splice(aleatorio,1) );
}
alert(lista);
O mais interessante é que o tamanho que ficou o codigo, se comparado com o que eu estava fazendo :D .
Então muito obrigado pela dica Beraldo sem ela eu não teria conseguido.
Vou passar a pensar mais orientado a objeto a partir de agora ;) .
A proposito eu gosto muito de python , queria poder utilizar ela no lugar do javascript.
Quem sabe um dia a google ou a mozila não decidem criar um suporte da linguagem nos seus navegadores :lol: .
PS: Não estou conseguindo editar o titulo do tópico, para colocar " [Resolvido] ".
>
PS: Não estou conseguindo editar o titulo do tópico, para colocar " [Resolvido] ".
Exclusividade de moderador :P
Logo algum deles fará isso. Fique tranquilo. :)
Fiz umas modificações ao codigo para poder utiliza-lo no sistema de login que estava fazendo.
Codigo:
function Randomiza(){
var amostra = new Array();
var lista = new Array();
var tamanho = 0;
var aleatorio = 0;
var alcance = 0;
this.sequencia = function(valMin,valMax)
{
alcance = valMax;
for(var i = valMin; i <= valMax; i++)
{
amostra.push(i);
}
}
this.geraSequenciaAleatoria = function()
{
while(lista.length <= alcance)
{
tamanho = amostra.length;
aleatorio = Math.floor( Math.random() * tamanho );
lista.push( amostra.splice(aleatorio,1) );
}
return lista;
}
}
Agora é só instancia-lo em uma variavel:
var lista = new Randomiza();
E depois passar os dados da sequencia numerica( de tanto a tanto )
lista.sequencia(0,9);
Por ultimo é só gerar a sequencia aleatoria:
var recebe_lista = new Array();
recebe_lista = lista.geraSequenciaAleatoria();
E para matar a curiosidade, estou desponibilizando o sistema de login(html e imagens, nada de php com os dados do servidor e ect :P )
link:Clique aqui
So um pequeno detalhe , abra ele de preferencia com um navegador que nao seja o IE.
Tem um botao com problemas para serem corrigidos(só acontece nesse bendito IE)
em vez de encher de loop para verificar a existência de um número, use duas listas: uma com a amostra (todos os números que podem ser usados) e outra lista para armazenar os números sorteados
ao sortear um número da lista de amostra, mova-o para a lista final e remova-o da amostra.
assim não se repetem e não precisa de loop