Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom galera como o titulo ja disse, eu preciso repetir um numero de 1 a 100, e nao pode repetir nenhum...
Tava usando a funçao rand mais a mesma repete valores,
Deste já agradeço pela ajuda!
>
Remova os números que já foram sorteados enquanto o total for maior que 0.
abs
Como assim, poderia me da um exemplo ?
hum...
<?php
$arr = range(1,100);
shuffle( $arr );
foreach( $arr AS $each )
{
echo $each, '<br />';
}>
hum...
<?php
$arr = range(1,100);
shuffle( $arr );
foreach( $arr AS $each )
{
echo $each, '<br />';
}
Aééé, Bruno, era exatamente isso !
Agora pra min exibir cada numero de 2 em 2 segundos é dificil ?
Com foreach é mais complicado de se fazer, então eu sugeriria usar um for-loop:
<?php
$arr = range(1,100);
shuffle( $arr );
for( $i = 0; $i < 100; $i += 1 ) {
echo $arr[ $i ], '<br />';
$i += 1;
echo $arr[ $i ], '<br /><br />';
}
O loop ocorre 100 vezes mas é limitado a menos que 100, porque arrays, como o gerado por range(), iniciam em zero. Se você usar algum valor que não seja fixo, como o comprimento de outro array, você troca aquele sem pela contagem de elementos.
A idéia aqui é você, de certa forma, violar o controlador de iteração, re-incrementando ele dentro do próprio loop.
Se preferir a sintaxe de foreach mas não quiser toda complicação que seria fazer com ele, pode usar array_chunk() para quebrar o array em pedaços de dois elementos:
<?php
$arr = range(1,100);
shuffle( $arr );
$arr = array_chunk( $arr, 2 );
foreach( $arr AS $each )
{
echo $each[ 0 ], '<br />';
echo $each[ 1 ], '<br /><br />';
}@Bruno Augusto
Muito obrigado amigo!
mais o que eu queria agora é tipo um sistema de bingo, onde cada hora o sistema me retorna um numero que ta na Array.... 1 por 1, ate chegar no ultimo!
Deste já agradeço!
@kinho! ai eu faria com javascript e não com php.
a lógica é a mesma.
>
@kinho! ai eu faria com javascript e não com php.
a lógica é a mesma.
Amigo eu sou meio lerdo nesse sentido, tem como voce me da um exemplo em Javascript de comi ia fikar os codigos? Deste de já agradeço pela grande ajuda que esta me dando, e peço desculpa pelo encomodo!
1. É um sistema web?? Digo isso porque ficar pausando a execução do script pode extrapolar o limite de execução do servidor e você recebe um **Erro de *Timeout***.
2. Outro problema dos sistemas web é que você pode esbarrar no cache, tanto do servidor quanto do browser. Isso quer dizer que só haverá saída na tela depois que todo o conteúdo for recebido. Traduzindo, você ficará esperando, esperando, esperando e então recebe todos os números do bingo de uma vez só.
Sem levar em conta estes dois possíveis problemas, a solução fica assim:
<?php
$numbers = range(1, 100);
shuffle($numbers);
$number = current($numbers);
while (is_integer($number)) {
echo $number . PHP_EOL;
sleep(2);
$number = next($numbers);
}Se você se deparar com o primeiro problema (timeout), você pode tentar resolver no PHP definindo a diretiva max_execution_time
<?php
$numbers = range(1, 100);
$delay = 2; // Intervalo entre o sorteio dos números
ini_set('max_execution_time', sizeof($numbers) * $delay + 10);
shuffle($numbers);
$number = current($numbers);
while (is_integer($number)) {
echo $number . PHP_EOL;
sleep(2);
$number = next($numbers);
}Se estiver esbarrando no segundo problema, uma possível solução é forçar a saída com flush/ob_flush
<?php
$numbers = range(1, 100);
$delay = 2; // Intervalo entre o sorteio dos números
ini_set('max_execution_time', sizeof($numbers) * $delay + 10);
shuffle($numbers);
$number = current($numbers);
while (is_integer($number)) {
echo $number . PHP_EOL;
flush();
ob_flush();
sleep(2);
$number = next($numbers);
}
Uma implementação alternativa é fazer isso via JavaScript(function () {
"use strict";
var numbers, interval;
Array.prototype.range = function (min, max, step) {
for (step = step || 1; min <= max; min += step) {
this.push(min);
}
return this;
};
Array.prototype.shuffle = function () {
var i, j, len, val;
len = this.length;
for (i = 0; i < len; i += 1) {
j = Math.round(Math.random() * len);
val = this[i];
this[i] = this[j];
this[j] = val;
}
return this;
};
numbers = [].range(1, 100).shuffle();
function nextNumber() {
if (!nextNumber.i) {
nextNumber.i = 0;
}
if (nextNumber.i > numbers.length) {
clearInterval(interval);
return;
}
window.alert(numbers[nextNumber.i]);
nextNumber.i += 1;
}
setInterval(nextNumber, 2000);
}());Era exatamente isso ! os codigos do JavaScript resolveu minha duvida ! Muito obrigado galera. Que Deus Abençoe voces que colaboraram pra responder a duvida!
Manos,
Legal mesmo essa alternativa em javascript! Porém tirei o Interval e mudei o alert para document.write e notei que ele gera um número 101 como "undefined". Se diminuir o range pra 15, mais "undefined" aparece. Alguém sabe como resolver?
Outra coisa, tem como fazer isso de forma mais simples co menos linhas?
Bom dia proceis!
>
Manos,
Legal mesmo essa alternativa em javascript! Porém tirei o Interval e mudei o alert para document.write e notei que ele gera um número 101 como "undefined". Se diminuir o range pra 15, mais "undefined" aparece. Alguém sabe como resolver?
Troque a linha que contém...
if (nextNumber.i > numbers.length) {
por
if (nextNumber.i >= numbers.length) {
>
Outra coisa, tem como fazer isso de forma mais simples co menos linhas?
Bom dia proceis!
Depende do que você precisa.
O primeiro bloco:
Array.prototype.range = function (min, max, step) {
for (step = step || 1; min <= max; min += step) {
this.push(min);
}
return this;
};
serve para gerar o vetor com o intervalo desejado. Se você já o possui, não precisa desse pedaço.
O segundo bloco
Array.prototype.shuffle = function () {
var i, j, len, val;
len = this.length;
for (i = 0; i < len; i += 1) {
j = Math.round(Math.random() * len);
val = this[i];
this[i] = this[j];
this[j] = val;
}
return this;
};
é responsável por embaralhar os componentes do vetor. Novamente, se você já tem isso, não precisa deste pedaço, também.
O último pedaço, que é o real responsável pela mágica, pode ser reescrito de forma mais simples, mas viola algumas das práticas de programação que eu, particularmente, sigo.
Remova os números que já foram sorteados enquanto o total for maior que 0.
abs