Acabei de ver um cara perguntando isso no fórum.imasters.

Ele queria saber como exibir aleatoriamente números de 1 a 100, sem repeti-los.

Bom, primeiro precisamos dos tais números de 1 a 100

$arr = range(1,100);

Ok, então preciso exibir cada um desses números aleatoriamente, sem repeti-los.

O primeiro código que me veio na cabeça, foi o seguinte:

<?php

$arr = range(1,100);

while( sizeof( $arr )>0 )
{
  shuffle( $arr );
  echo $arr[0], '<br />';
  unset( $arr[0] );
}

Não é o “melhor” código, nem o mais performático. Mas não é isso que me fez escrevê-lo.

Fiz apenas para “ver se resolvia”. Worse is better.

Ok, vamos lá. O loop ali, anda no array até ele “acabar”, pois conforme vou exibindo a primeira posição do array, eu removo este item dele.

Funciona. Mas note o shuffle ali dentro do loop. A cada volta ele é feito desnecessariamente.

Se desordenei o array uma vez, não preciso ficar fazendo isso a cada elemento que for exibir. Os próximos elementos já estarão “em ordem aleatória”.

Então, esse “incomodo” que estava atrapalhando a performance, e tornava o algoritmo mais complicado do que preciso, podemos jogar para fora do loop, e apenas exibir o array:

<?php

$arr = range(1,100);

shuffle( $arr );
foreach( $arr AS $each )
{
  echo $each, '<br />';
}

Bem melhor.

Mas o importante foi a iniciativa de começar. Precisei de cerca de 4 minutos para ler o problema, formular o código ruim, e depois chegar a solução final.

O importante é não travar, não ficar só pensando, só especulando.. sem rascunhar, sem tentar.

Tente, comece fazendo um código ruim, desde que depois vc o melhore.