Pergunta

Usando PHP (outras línguas, usando comum built-ins são bem-vindos), como posso obter um número aleatório (ou pseudo-aleatório) que não corresponde a um determinados critérios?

IE: Quero $x = rand(0, 99) mas só se ($x % 9) != 0.

O que é uma maneira limpa aceitável para restringir números aleatórios com um critério assim?

Como exemplo, usando um loop while(), e possivelmente breaking quando temos algo que atenda os critérios, em seguida, usando o número aleatório após o loop ?:

while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) ) 
{ 
    // Do nothing?
}

Ou algo como:

while ( $rand_key = array_rand($array_of_items) ) 
{ 
    if ( $rand_key % 9 == 0 ) {
        break;
    }
}

Ou há uma forma mais concisa ou forma adequada para conseguir isso?

Foi útil?

Solução

Um dos raros casos em que um do-while realmente ajuda

$testData = array( 7, 8, 9 );

do {
  $rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );

echo $testData[$rand];

Outras dicas

É esse o seu caso de uso exata, ou apenas um exemplo?

Se você está tentando (em particular) para obter números de 0 a 99, excluindo múltiplo exacto de 9, eu posso pensar em um par de maneiras de evitar o looping estranho. As pessoas não gostam de loop while geração de números aleatórios, porque você poderia loop para sempre. (Mas é claro que não vai acontecer se você não é do tipo extremamente azarado -. O tipo de pessoa que passa a obter-se em tiroteios com Clint Eastwood no spaghetti westerns)

  1. Você poderia ter uma tabela de pesquisa que remapeia os números aleatórios que você começa para os que você deseja.

  2. Gerar 0-88 aleatoriamente. Multiplicar o resultado por nove e dividir por 8 e obter o resultado inteiro (piso, não volta). Em seguida, adicione 1.

Ambos têm tempo previsível.

Um método alternativo, que comercializa espaço para, potencialmente, várias chamadas PRNG, para os casos com um pequeno número de resultados válidos (como no seu exemplo) seria para preencher uma matriz com as soluções válidas e utilizar o PRNG para produzir um índice para a matriz.

método Tudo o que você escolher Eu também sugerem, por código de produção, observando a razão para a restrição de uma forma acessível e apropriada.

Isto combina 'conciso' exigência:

while( ($x = rand(0, 99)) % 9 == 0 );
echo $x;

ou

while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 ); 
echo $array_of_items[$rand_key];     

No entanto, não é muito legível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top