[RESOLVIDO] PHP - Números randômicos

Querendo fazer o seguinte (aprendizado) - gerar números de 1 a 60 (tipo mega sena) e que eles não podem ser igual ao outro, cheguei a esta lógica que não funciona, alguém poderia me dar alguma alternativa? 
<?php

    $num1 = rand (1,60) != ($num2.$num3.$num4.$num5.$num6);
    echo ($num1) ."<br>";

    $num2 = rand (1,60) !=($num1.$num3.$num4.$num5.$num6);
    echo ($num2)."<br>";


    $num3 = rand (1,60) !=($num1.$num2.$num4.$num5.$num6);
    echo ($num3) ."<br>";


    $num4 = rand (1,60) !=($num1.$num2.$num3.$num5.$num6);
    echo ($num4) ."<br>";

    $num5 = rand (1,60) !=($num1.$num2.$num3.$num4.$num6);
    echo ($num5) ."<br>";

    $num6 = rand (1,60) !=($num1.$num2.$num3.$num4.$num5);
    echo ($num6) ."<br>";
    ?>

se executar vai dar isso:
Notice: Undefined variable: num2 in C:\xampp\htdocs\mega\index.php on line 3

Notice: Undefined variable: num3 in C:\xampp\htdocs\mega\index.php on line 3

Notice: Undefined variable: num4 in C:\xampp\htdocs\mega\index.php on line 3

Notice: Undefined variable: num5 in C:\xampp\htdocs\mega\index.php on line 3

Notice: Undefined variable: num6 in C:\xampp\htdocs\mega\index.php on line 3
1

Notice: Undefined variable: num3 in C:\xampp\htdocs\mega\index.php on line 6

Notice: Undefined variable: num4 in C:\xampp\htdocs\mega\index.php on line 6

Notice: Undefined variable: num5 in C:\xampp\htdocs\mega\index.php on line 6

Notice: Undefined variable: num6 in C:\xampp\htdocs\mega\index.php on line 6
1

Notice: Undefined variable: num4 in C:\xampp\htdocs\mega\index.php on line 10

Notice: Undefined variable: num5 in C:\xampp\htdocs\mega\index.php on line 10

Notice: Undefined variable: num6 in C:\xampp\htdocs\mega\index.php on line 10
1

Notice: Undefined variable: num5 in C:\xampp\htdocs\mega\index.php on line 14

Notice: Undefined variable: num6 in C:\xampp\htdocs\mega\index.php on line 14
1

Notice: Undefined variable: num6 in C:\xampp\htdocs\mega\index.php on line 17
1
1

Na linha 3 está usando num2 sem definir antes.

Vou tentar fazer usando o if/else - não dá certo pois ele fala que as variáveis não estão sendo inicializadas.

Isso acontece pois está fazendo uso de variáveis antes mesmo de criá-las / atribuir valores. Veja:

Nesta linha, você faz uso das variáveis num2,num3, num4, num5, num6
$num1 = rand (1,60) != ($num2.$num3.$num4.$num5.$num6);
Perceba que antes desta linha elas se quer existiam, portanto nenhum valor foi definido para elas. Por isso o erro “Undefined variable” , significa “variável indefinida”.
E você continua cometendo o mesmo erro nas linhas seguintes, fazendo uso de variáveis que não existem e/ou que não foram definidas.

1 curtida

Entendi agora, obrigado!
A melhor forma a se fazer em minhas pesquisas foi:
Assim você nunca irá repetir o mesmo número.

$num1 = rand(1,10);
	$num2 = rand(11,20);
	$num3 = rand(21,30);
	$num4 = rand(31,40);
	$num5 = rand(41,50);
	$num6 = rand(51,60);

O seu código é eficaz e eficiente, mas só se a quantidade de números aleatórios for sempre 6. Imagine que você precise adicionar mais 2 números, você teria que escrever mais duas linhas de código:

$num1 = rand(1,10);
$num2 = rand(11,20);
$num3 = rand(21,30);
$num4 = rand(31,40);
$num5 = rand(41,50);
$num6 = rand(51,60);
$num7 = rand(61,70);
$num8 = rand(71,80);

Veja que existe um padrão aqui, os argumentos passado para a função rand() aumentam de 10 em 10. Tendo isto em vista, você poderia elaborar um for que facilite a manutenção do código:

$quantity = 6;
$arr; 
$min = 1;
$max = 10;
for($i=0; $i < $quantity; $i++)
{
	$arr[i] = rand($min, $max);
	$min += 10;
	$max += 10;
}

Perceba que para aumentar/diminuir a quantidade de números aleatórios, basta alterar a variável $quantity.

e se quiser exibir esses valores em uma só linha?

Quando trabalhamos com array, a tendência é usarmos laços de repetição. Para exibir os valores numa única linha, basta usar um for com o echo veja:

for($i = 0; $i < $quantity; $i++)
{
  echo $arr[$i] . " ";
}

Ficando o código completo da seguinte forma:

$quantity = 6;
$arr; 
$min = 1;
$max = 10;

for($i=0; $i < $quantity; $i++)
{
   $arr[$i] = rand($min, $max);
   $min += 10;
   $max += 10;
}

for($i = 0; $i < $quantity; $i++)
{
  echo $arr[$i] . " ";
}

Perceba que reaproveitei a variável quantity, no entanto você pode descobrir o tamanho do array de forma dinâmica usando a função count. ex:

for($i = 0; $i < count($arr); $i++)
{
  echo $arr[$i] . " ";
}

Fiz o teste aqui e o formato da saída ficou assim:
3 16 21 38 48 52

1 curtida

Amigo, excelente sua explicação e me ajudou muito aqui tambem. Agora me explica o seguinte: como faria para verificar se a sequencia de numeros geradas ja existe, evitando que fossem geradas sequencias repetidas ? ou seja, se eu quiser guardar os numeros gerados em um BD mas antes eu quero verificar se a sequencia gerada já existe no banco ? Como seria ?

Sei que o tópico é antigo, mas gostaria de sugerir uma alternativa às soluções propostas.

O problema original era gerar números da mega-sena. Ou seja, 6 números aleatórios entre 1 e 60, sem repetição.

A solução proposta foi:

$num1 = rand(1,10);
$num2 = rand(11,20);
$num3 = rand(21,30);
$num4 = rand(31,40);
$num5 = rand(41,50);
$num6 = rand(51,60);

Que de fato não repete os números, mas não é boa porque aí está restrigindo demais os resultados. Por exemplo, só vai ter um número entre 1 e 10, e somente um entre 11 e 20, somente um entre 21 e 30, etc. Mas em um sorteio real da mega-sena, é perfeitamente possível ter mais de um número em um desses intervalos. Por exemplo, em um sorteio recente saíram os números 12 e 18 (ou seja, dois números entre 11 e 20), e nenhum número maior que 50.

Sendo assim, uma forma melhor de evitar repetição e não restringir a intervalos específicos é usar o clássico algoritmo de Fisher-Yates: crie um array com todos os números, embaralhe esse array e pegue os 6 primeiros.

Em PHP seria algo assim:

// números de 1 a 60
$numeros = range(1, 60);
// embaralha
shuffle($numeros);
// pega os 6 primeiros
$sorteio = array_slice($numeros, 0, 6);
// mostra todos na mesma linha, separados por vírgula
echo implode(', ', $sorteio);