Ir para conteúdo

POWERED BY:

Arquivado

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

kinho!

Exibir numero de 1 a 100, sem repetir

Recommended Posts

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum...

<?php

 

$arr = range(1,100);

 

 

shuffle( $arr );

foreach( $arr AS $each )

{

echo $each, '<br />';

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 />';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@kinho! ai eu faria com javascript e não com php.

 

a lógica é a mesma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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);
}
Um palpite pessoal: Dois segundos entre os números é muito pouco pra um bingo.

 

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);
}
Caso isso não seja suficiente, será necessário configurar seu servidor web para permitir um tempo maior.

 

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);
}());

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era exatamente isso ! os codigos do JavaScript resolveu minha duvida ! Muito obrigado galera. Que Deus Abençoe voces que colaboraram pra responder a duvida!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

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.