2012-05-03 13 views
5

Tengo un script PHP donde tengo una matriz de enteros, digamos $forbidden.Entero aleatorio con condiciones

Quiero obtener un entero aleatorio de 1 a 400 que no está en $forbidden.

Por supuesto, no quiero ningún bucle que se rompa cuando rand da un resultado de trabajo. Me gustaría algo más efectivo.

¿Cómo se hace esto?

+1

¿Por qué el bucle no es efectivo? –

+0

@MichaelRobinson: no es efectivo porque $ prohibido puede ser muy grande. Paul: He pensado en obtener todos los enteros posibles en una matriz y luego obtener una muestra de ello, pero me preguntaba si hay algo mejor en el lenguaje – Cydonia7

+0

@MichaelRobinson: Looping no es efectivo porque en teoría puede golpear números prohibidos 1000000 veces seguidas (aunque si eso sucede, probablemente deberías ir y completar un poco de lotería), pero sí. –

Respuesta

10

Coloque todos los números prohibidos en una matriz y use array_diff de range(1,400). Obtendrá una serie de números permitidos, elija uno al azar con array_rand().

<?php 

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

echo $allowed[array_rand($allowed)]; 

De esta manera usted es la eliminación de los números excluidos del conjunto de selección, y anulando la necesidad de un bucle :)

+0

¡No sabía array_diff, lo estaba buscando por un tiempo! Gracias por la respuesta. – Cydonia7

0

producir una serie de los números permitidos. Descubre el número en esta matriz. Seleccione uno de esos aleatoriamente.

Cuestiones relacionadas