2012-05-03 32 views
5

Ho uno script PHP in cui ho una matrice di numeri interi, diciamo $forbidden.Numero intero casuale con condizioni

Voglio ottenere un numero intero casuale compreso tra 1 e 400 che non sia in $forbidden.

Naturalmente, non voglio alcun ciclo che si interrompe quando Rand dà un risultato di lavoro. Mi piacerebbe qualcosa di più efficace.

Come si fa?

+1

Perché il ciclo non è efficace? –

+0

@MichaelRobinson: Non è efficace perché $ forbidden può essere molto grande. Paul: Ho pensato di ottenere tutti gli interi possibili in un array e poi ottenere un campione da esso, ma mi chiedevo se c'è qualcosa di più bello nella lingua – Cydonia7

+0

@MichaelRobinson: Looping è inefficace perché in teoria potresti colpire i numeri proibiti 1000000 di seguito (anche se ciò accade probabilmente dovresti andare a compilare qualche lotteria), ma si. –

risposta

10

Inserire tutti i numeri vietati in una matrice e utilizzare array_diff da range(1,400). Otterrai una serie di numeri consentiti, ne scegli uno a caso con array_rand().

<?php 

$forbidden = array(2, 3, 6, 8); 
$complete = range(1,10); 
$allowed = array_diff($complete, $forbidden); 

echo $allowed[array_rand($allowed)]; 

In questo modo si sta rimuovendo i numeri esclusi dal gruppo di selezione, e annullando la necessità di un ciclo :)

+0

Non sapevo array_diff, lo stavo cercando da un po '! Grazie per la risposta. – Cydonia7

0

produrre una serie di numeri consentiti. Scopri il numero in questo array. Seleziona uno di quelli a caso.