2008-10-12 45 views
6

¿Cómo se genera un número aleatorio dentro de un rango sin incluir cierto rango (s)? P.ej. 1-10 variar pero no en 2-4 ó 7. Soluciones que he utilizado hasta ahora:Generando un número aleatorio excluyendo el rango

  • generar una una prueba al azar si está dentro del rango dis-permitidos. Según el resultado, ya sea salida el número o intente de nuevo.
  • El mapa permitido tiene un rango uniforme. Obtenga un aleatorio entre 1 y 6 y luego trace hacia atrás (es decir, 6 se convierte en 10).
  • Crear rangos permitidos (1-1,5-6,8-10). Elija aleatoriamente un rango (opcionalmente utilice pesos) y un número en el rango elegido.

¿Cuál es su solución?

Respuesta

8

(b) Utilice el rango único y el mapa para valores permitidos.

(a) Es más lento y el tiempo de ejecución no es determinante porque tiene que esperar hasta que obtenga un número en el rango correcto. Si saltases un rango grande, te mancharían con una manguera.

(c) Es más complejo que (b); no agregue complejidad si no se requiere.

+0

(c) también debe usar rangos ponderados. De lo contrario, considere: 0..10, 20..80, 90..100; hay tres rangos, pero si los intervalos son igualmente probables de ser seleccionados, entonces verá resultados muy sesgados. –

+1

Sí, si la distribución es importante (de ahí mi afirmación sobre el uso opcional de ponderaciones). También soy consciente de los inconvenientes de cada método: me preguntaba si existe una solución más elegante :) – Goran

1

Depende de cuántos/grandes sean los rangos de exclusión. La prueba del rango des-permitido (su opción 1) funcionaría bien para juegos pequeños; no hay necesidad de complicar la solución a un problema fácil. La solución 3 funcionaría mejor para conjuntos de exclusión más numerosos. La solución 2 es la que más funciona, pero probablemente la solución teórica más correcta.

1

Generalmente utilizo la técnica descrita por la viñeta número dos anterior, especialmente si el conjunto de números permitidos es razonablemente pequeño. Desde un punto de vista estadístico, es fácil arruinar la aleatoriedad de los resultados o desviar los resultados de una distribución plana.

Tiene la ventaja adicional de permitir una sola selección (como repartir cartas o escoger bolas de bingo) ... simplemente elimina los valores ya seleccionados del mapa.

0

Parece que su algoritmo puede beneficiarse de un ligero rediseño que hará que la creación de números aleatorios implícita en lugar de encontrarlos explícitamente utilizando un generador de números aleatorios.

Por ejemplo, si desea obtener una serie aleatoria de los números del 1 al 10, es mejor comenzar desde una serie ordenada, mezclarla de alguna manera, por ejemplo, mediante el intercambio (había una pregunta sobre esto, creo) y toma los números uno después del otro.

1

Localícelos en el total de los rangos que espera. luego distribúyalos entre los rangos.

E.g. si necesita un número aleatorio entre 0..10 y 100..110

Genere un número aleatorio entre 20. Los 10 inferiores se asignan al rango 0..10, el resto al otro intervalo (o algo así eso - Puedo estar apagado por uno ... La aritmética de intervalos es una de estas cosas que nunca consigo en el primer intento).

La razón detrás de esto es que a menudo se trata de generadores aleatorios no perfectos.Estos comienzan a comportarse de manera extraña si distribuye variables sucesivas de números aleatorios en varias dimensiones (por ejemplo, primero elija un intervalo aleatorio, luego elija un azar dentro del intervalo elegido). Eso puede conducir a un comportamiento no aleatorio muy obvio.

Si comienza con un generador de números aleatorios mejor que obtiene sus datos de fuentes aleatorias reales, puede terminar desperdiciando valiosos bits aleatorios. Si lo haces solo una vez por segundo, puede que no sea un problema. Si lo haces con frecuencia, aunque tu programa se quede estancado porque las fuentes aleatorias puras tienen que ponerse al día con tu consumo de bits aleatorios.

+0

Apagado por uno en cada uno de los dos rangos, me temo (11 valores en el rango 0..10; asimismo 100 ..110). –

Cuestiones relacionadas