Ir para conteúdo

POWERED BY:

Arquivado

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

antoniomilat

Sorteio (gerando números aleatórios)

Recommended Posts

Olá!

Eu estava entediado e resolvi fazer um script para sortear números dentro de um intervalo pré-determinado, tendo a opção de definir um limite (por exemplo, quero que sorteie no máximo 5 números entre 1 e 100).

Também tem uma função para ordenar os números já sorteados em ordem crescente.

 

Embora o arquivo tenha php, o funcionamento dele é todo em javascript, por isso postei aqui.

 

É um script simples. Segue o código abaixo para quem quiser consultar, melhorar ou sugerir alterações:

 

<!-- Nomear arquivo como sorteio.php -->
<!DOCTYPE html>
<html>
	<head>
		<title>Sorteio</title>
		<script>
			//Função para permitir apenas números nos campos de entrada
			function somenteNumero(e){
				var tecla=(window.event)?event.keyCode:e.which;   
				if((tecla>47 && tecla<58)) return true;
				else{
					if (tecla==8 || tecla==0) return true;
				else  return false;
				}
			}
		
			var vetor = new Array();
			
			//Função para sortear aleatoriamente números dentro do intervalo determinado
			function sortear(de, ate, limite){
				var qtde = limite;
				//Se o vetor ainda não atingiu o limite determinado
				if (qtde > vetor.length){
					do {
						var aux = 0;
						//Sorteia um número dentro do intervalo
						var numero = Math.floor((Math.random() * (ate-de+1))+de);
						//Verifica se número já foi sorteado
						for (i=0;i<vetor.length;i++){
							if (vetor[i] == numero){
								aux++;
							}
						}
					//Se número já foi sorteado, repete o sorteio
					} while (aux > 0);
					//Imprime número sorteado na tela
					var campo=document.getElementById("numero")
						campo.innerHTML=numero;
					//Adiciona número sorteado ao fim do vetor
					vetor.push(numero);
					var aux2 = 0;
					var vetorado;
					//Copia vetor tratando exibição
					for (i=0;i<vetor.length;i++){
						if (aux2 == 0){
							vetorado = vetor[i];
						} else {
							if (aux2 % 10 == 0){
								vetorado = vetorado+"<br />"+vetor[i];
							} else {
								vetorado = vetorado+" - "+vetor[i];
							}
						}
						aux2++;
					}
					//Exibe vetor com números já sorteados após tratar exibição
					var campo2=document.getElementById("vetor");
						campo2.innerHTML=vetorado;
				//Se o vetor atingiu o limite, exibe mensagem e oculta botão
				} else {
					alert ("Acabou");
					botao.style.display = "none";
				}
			}
			
			//Função para auxiliar ordenação númerica do vetor
			Array.prototype.sortnum = function() {
				return this.sort(function(){return arguments[0] - arguments[1];});
			}
			
			//Função para ordenar o vetor
			function ordenar(){
				//Ordenação
				var vetordenado = vetor.sortnum();
				var aux = 0;
				//Trata novamente o vetor
				for (i=0;i<vetordenado.length;i++){
					if (aux == 0){
						vet = vetordenado[i];
					} else {
						if (aux % 10 == 0){
							vet = vet+"<br />"+vetordenado[i];
						} else {
							vet = vet+" - "+vetordenado[i];
						}
					}
					aux++;
				}
				//Exibe o vetor ordenado com números já sorteados na tela
				var campo=document.getElementById("vetor");
					campo.innerHTML=vet;
			}
			
			//Função para validar o formulário antes do envio
			function validar(form){
				//Se o campo 'de' estiver vazio: exibe mensagem de erro e impede envio
				if (form.de.value == ''){
					alert("Informe o primeiro campo");
					form.de.focus();
					return false;
				}
				//Se o campo 'ate' estiver vazio: exibe mensagem de erro e impede envio
				if (form.ate.value == ''){
					alert("Informe o segundo campo");
					form.ate.focus();
					return false;
				}
				//Se o campo 'ate' for menor do que o 'de': exibe mensagem de erro e impede envio
				if (form.ate.value < form.de.value){
					alert("O segundo número deve ser maior que o primeiro");
					form.de.focus();
					return false;
				}
				//Se o campo 'limite' estiver vazio: considera como limite o total de números no intervalo
				if (form.limite.value == ''){
					form.limite.value = (form.ate.value - form.de.value)+1;
				}
				return true;
			}
		</script>
	</head>

<?php
	//Se o formulário ainda não foi enviado
	if (!isset($_POST['de']) and !isset($_POST['ate'])){
	?>
		<body>
			<br />
			<table width='50%' align='center' border=1>
				<tr>
					<td align='center' width="30%">
						<h2>Sortear</h2>
						<form action='sorteio.php' method='POST' onsubmit="return validar(this);">
							De: <input type='text' name='de' id="de" size='3' maxlength='4' onkeypress="return somenteNumero(event);"/> 
							até: <input type='text' id="ate" name='ate' size='3' maxlength='4' onkeypress="return somenteNumero(event);"/>
							<br />
							<br />
							Limite: <input type='text' name='limite' id="limite" size='3' maxlength='4' onkeypress="return somenteNumero(event);"/> 
							<br />
							<br />
							<input type='submit' value="Iniciar" />
						</form>
						<br />
					</td>
				</tr>
			</table>
		</body>	
	<?php
	//Se formulário já foi enviado
	} else {
	?>
		<!-- Carrega função para sortear primeiro número -->
		<body onload="sortear(<?=$_POST['de']?>, <?=$_POST['ate']?>, <?=$_POST['limite']?>);">
			<br />
			<table width='50%' align='center' border=1>
				<tr>
					<td align='center'>
						<h2>Sorteio</h2>
						<p id="numero" style="font-size:72px"> </p>
						<button id="botao" onclick="sortear(<?=$_POST['de']?>, <?=$_POST['ate']?>, <?=$_POST['limite']?>)">Próximo</button>
						<br /><br /><br />
						Números já sorteados:
						<p id="vetor" style="font-size:25px"></p>

						<button id="botao" onclick="ordenar()">Ordenar</button>
						
						<br><br>
						<h3><a href="sorteio.php">Novo sorteio</a></h3>
					</td>
				</tr>
			</table>
		</body>
	<?
	}
	?>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

I aew cara, beleza, bom, seu script ta legal mas parece que um pouco confuso, acho que da pra dar uma enxugada no código, segue o exemplo:

 

function SorteioException(message){
				this.message = message;
				this.name = 'SorteioException';
				this.toString = function() {
				  return this.name + ': ' + this.message;
			   };
			}
			
			function Sorteio(){
				return {
				
					sortear : function(de, ate, limite){
					
						if (ate-de < limite){
							throw new SorteioException('A subtração dos numeros de(' + de + ') - ate(' + ate + '), não pode ser menor que o limite(' + limite + ')');
						}
					
						var vetor = new Array();
						
						while (limite > vetor.length){
							var numero = Math.ceil(Math.random() * ( ate - de) + de);

							if(vetor.indexOf(numero) == -1) vetor.push(numero);
						}
						vetor.sort(function(a, b){
							return (a > b) ? 1 : -1;
						});
						
						alert('Acabou');
						return vetor;
					},
					
					printarSorteados : function(vetor, idElement){
						var elemento = document.getElementById(idElement);
						elemento.innerHTML = vetor.join(' - ');
					}
				}
			}	
						
			window.onload = function(){
				try {
					var numerosSorteados = Sorteio().sortear(60, 100, 5);
					Sorteio().printarSorteados(numerosSorteados,'numerosSorteados');
				} catch(e){
					console.log(e.toString())
				}
			}

 

 

e o HTML:

 

Números Sorteados: <span id="numerosSorteados"></span>

abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Romerito. Obrigado pela resposta!

 

Você otimizou bem o código... além do script ser funcional ele ficou 'limpo' (:

 

vou aproveitar meu tempo livre pra estudar as alterações que você fez...

 

Valeu!

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.