Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CiroClaw

[Resolvido] criar uma sequencia numerica e randomica sem repetir

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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
# -*- coding: utf-8 *-*

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

http://docs.python.org/library/random.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

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] ".

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.