Ir para conteúdo

POWERED BY:

Arquivado

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

Paula Torris

Como gerar numeros aleatorios no PHP

Recommended Posts

Olá gente,Eu preciso gerar um número aleatório em php de 1 a 1000.Então se eu usar o rand(1,1000) eu soluciono este problema.Agora que vem o problema.Se eu tenho um array com alguns numeros, exemplo$numero[1] = "300";$numero[2] = "250";$numero[3] = "600";Como gerar um numero aleatorio de 1 a 1000 que não seja igual a estes numeros do ARRAY, existe alguma forma?Desde já, obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Bruno,Então, o problema é desempenho,Dá para colocar em um loop e ficar verificando se o número gerado aleatorio é igual a um numero do array, igual abaixo:mas quando o array com as exceções fica muito grande acredito que possa comprometer em desempenho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesse ponto não. você pode colocar um if assim que a função estiver terminando. verificando isso. não causa muita lentidão ao servidor. seria uma chamada simples. se for != do array. ele retorna se não ele chama a função denovo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pensei em fazer algo simples como:

 

while( !$flag ) {	 $aleatorio = rand(1,1000);		 while ( list($chave,$valor) = each($numeros) ) //percorre o array com os numeros que nao podem ser gerados					 {									if($aleatorio==$valor)							{								$erro = "1";							  }					 }	if($erro != "1" ) 	  $flag = 1;}

Mas queria saber se alguem poderia fornecer alguma solucao melhor?

 

Algo hipotético como rand(1,1000, menos $array);

 

ou qualquer outra solucao que nao comprometa desempenho.

 

Este codigo acima causaria problema pois suponha que o Array que contem numeros que nao podem ser gerados pelo rand() tenha 990 numeros...

 

iria ficar em um loop gigantesco até encontrar um dos 10 numeros possiveis entre 1 e 1000 para ser gerado, já que 990 nao podem ser sorteados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?phpecho str_shuffle(substr("1234567890", rand(0,1),8));?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?phpecho str_shuffle(substr("1234567890", rand(0,1),8));?>

Olá asanoli,Sei o que isso retorna mas não saquei como poderia usar em meu caso...o substr ali retorna uma string a partir de um rand até um numero definido a partir de outro numero definido....o shuffle apenas embaralha isso depois...Nao entendi a ideia que voce quis passar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo como isto aqui:

 

<?phpclass CodeGen{	private $codes = array();	public function __construct($codes)	{		$this->codes = $codes;	}	public function getRandomCode($min, $max)	{		$next = count($this->codes) + 1;		while (count($this->codes) < $next) {			$code = mt_rand($min, $max);			if (!in_array($code, $this->codes)) {				$this->codes[] = $code;			}		}	}	public function getLastCode()	{		return end($this->codes);	}}$codes = array(300, 250, 600);$CodeGen = new CodeGen($codes);$CodeGen->getRandomCode(1, 1000);print $CodeGen->getLastCode();?>
[]s :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo como isto aqui:

<?phpclass CodeGen{	private $codes = array();	public function __construct($codes)	{		$this->codes = $codes;	}	public function getRandomCode($min, $max)	{		$next = count($this->codes) + 1;		while (count($this->codes) < $next) {			$code = mt_rand($min, $max);			if (!in_array($code, $this->codes)) {				$this->codes[] = $code;			}		}	}	public function getLastCode()	{		return end($this->codes);	}}$codes = array(300, 250, 600);$CodeGen = new CodeGen($codes);$CodeGen->getRandomCode(1, 1000);print $CodeGen->getLastCode();?>
[]’s :D
Nossa, muito obrigada mesmo, funciona perfeitinho :)Só uma perguntinha, você sabe se eu colocar 998 numeros neste array de numeros proibidos a serem sorteados este WHILE que procura o numero randomico ficará muito lento até achar os unicos dois numeros possiveis de 1 a 1000?Muita grata,Paula

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, muito obrigada mesmo, funciona perfeitinho :)

Que bom! :)

Só uma perguntinha, você sabe se eu colocar 998 numeros neste array de numeros proibidos a serem sorteados este WHILE que procura o numero randomico ficará muito lento até achar os unicos dois numeros possiveis de 1 a 1000?

Olha... Demorar demora um pouquinho mais, mas nada que seja perceptível viu! Num teste que fiz aqui (com os 998 números existentes), demorou cerca de 160 milésimos a mais do que se fosse gerado sem nenhum número "proibido". Talvez com mais números o tempo fique mais lento, mas com 1.000 garanto que será quase que instantâneo. ;)[]s :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, muito obrigada mesmo, funciona perfeitinho :)

Que bom! :)

Só uma perguntinha, você sabe se eu colocar 998 numeros neste array de numeros proibidos a serem sorteados este WHILE que procura o numero randomico ficará muito lento até achar os unicos dois numeros possiveis de 1 a 1000?

Olha... Demorar demora um pouquinho mais, mas nada que seja perceptível viu! Num teste que fiz aqui (com os 998 números existentes), demorou cerca de 160 milésimos a mais do que se fosse gerado sem nenhum número "proibido". Talvez com mais números o tempo fique mais lento, mas com 1.000 garanto que será quase que instantâneo. ;)[]’s :D
Hmmm, obrigada mesmo vidaloka,Se nao for abusar da sua boa vontade tenho mais duas perguntinhas.Voce poderia me falar como faz para medir em tempo de execução ou qualquer outro parametro o desempenho de um código?E outra coisinha é o seguinte, no php 5 roda legal esta classe, já no php 4 aparece este erroParse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in localhost/teste/teste.php on line 32Onde a linha 32 é o private $codes = array();Você sabe oq possa ser isso?Bjos. Paula.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Paula! Realmente respondi e só depois vi que não havia entendido direito a sua pergunta. Fiquei com uma dúvida. Para esta situação prática você não necessita que os números não sejam repetidos não? Caso positivo, como você vai fazer pra que não se repitam?Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

E outra coisinha é o seguinte, no php 5 roda legal esta classe, já no php 4 aparece este erro

Ah sim, estou tão acostumado com o PHP 5 que até esqueci que ainda usam o 4... http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

Para rodar em ambos, o código deve ser feito para o PHP 4:

 

<?phpclass CodeGen{	var $codes = array();	function CodeGen($codes)	{		$this->codes = $codes;	}	function getRandomCode($min, $max)	{		$next = count($this->codes) + 1;		while (count($this->codes) < $next) {			$code = mt_rand($min, $max);			if (!in_array($code, $this->codes)) {				$this->codes[] = $code;			}		}	}	function getLastCode()	{		return end($this->codes);	}}$codes = array(300, 250, 600);$CodeGen = new CodeGen($codes);$CodeGen->getRandomCode(1, 1000);print $CodeGen->getLastCode();?>
Quanto ao tempo de execução, para benchmarking, esta classe lhe ajudará: http://forum.imasters.com.br/index.php?showtopic=167331 ;)

 

[]s :D

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.