2010-10-19 22 views
11

puedo generar números aleatorios entre dos números en C usando este ..Generar número aleatorio entre dos números con una rara número

arc4random()%(high-low+1)+low; 

entonces ahora mi requisito es ... quiero hacer una serie rara. ... eso es decir que si se apareció

alta = 5, baja = 1, y raro = 3,

de 3 mucha menor frecuencia que 1,2,4 y 5 ...

Gracias

+9

Apuesto a que este tipo trabaja para un casino en línea :) – Joony

+0

nop ... yo trabajo para el partido 3 rompecabezas .. – Rony

+1

Usted también podría estar interesado en gamedev.stackexchange.com :) – badp

Respuesta

26

Se pueden utilizar tablas para calcular su rollo final, similar a cómo los juegos de rol de papel y lápiz hacer este mismo tipo de cálculo:

Rollo 1 D 21 (posiblemente fácilmente w/código).

  • Si obtiene 1-5, se cuenta como un 1
  • Si obtiene 6-10, se cuenta como un 2
  • Si obtiene 11-15, se cuenta como un 4
  • Si obtiene 16-20, se cuenta como un 5
  • Si se obtiene un 21, se cuenta como un 3

La ventaja de esta opción es que se consigue un fuerte sentido de las probabilidades exacto que está Tratando con. Puede hacerse una idea de qué tan raro o común es cada número, y obtiene un control detallado de qué tan común es cada número, en comparación con los otros números.

También podría usar fracciones para generar la tabla. Use el Least Common Multiple para determinar una base común. Esa base es el tamaño máximo de número aleatorio que necesitará. Luego, ponga todas las fracciones en términos similares. Use los numeradores resultantes para determinar el tamaño del rango para cada número en la tabla.

Con esta solución automatizada, los números de entrada son muy fáciles de entender entre sí. MI.g:

  • 1/4 para 1
  • 1/4 para 2
  • 1/4 para 4
  • 1/5 para 5
  • 1/20 para 3

Esto generaría una tabla así:

LCM = 20

  • 1-5 = 1 (como términos - 5/20)
  • 6-10 = 2 (5/20)
  • 11-15 = 4 (5/20)
  • 16-19 = 5 (4/20)
  • 20 = (1/20)

Algunos más en LCM: http://en.wikipedia.org/wiki/Least_common_multiple

11

Una sencilla de entender opción:

  • Generar un número a determinar si usted va a devolver el número raras (por ejemplo, generar un número en el rango [0-99], y si es 0, devolver el número raro
  • Si llega a este paso, está devolviendo un número no raro: siga generando números en el rango normal hasta que Obtenga cualquier número no raro y devuelva

Existen otros enfoques alternativos que solo requerirían que genere un solo número, pero lo anterior parece que sería el más simple de escribir y comprender.

+4

no es necesario para generar números repetidamente en el segundo paso, simplemente disminuya el rango en uno y si el número aleatorio> = el número raro, increméntelo. – Skizz

+0

@Skizz: Ciertamente * podrías * hacer eso, sí. Sería más eficiente. Creo que requeriría más ciclos cerebrales que simplemente repetir, al menos para mí, pero sigue siendo una buena idea. –

5

Se puede crear una matriz que contiene los números de acuerdo con su probabilidad:

list = (1, 1, 2, 2, 3, 4, 4, 5, 5); 
return list.itemAtIndex(random() % list.count()); 

Esto no es muy elegante, pero funciona y escala fácilmente si las probabilidades se vuelven más complejas.

+0

+1; Esta es una forma de implementar mi solución anterior, si el almacenamiento termina siendo bajo, no es una preocupación, o es una buena compensación frente al tiempo de CPU –

0
while true 
    generate a random number 
     if it's not the rare number, return it 
    generate a second random number - say from 1 to 100 
    if that second number's <= the percentage chance of the rare number compared to the others, return the rare number 

Nota: esto es rápido para el caso común o para devolver el número que no es raro.

1

La suma de todas las probabilidades debe ser 1. Ahora estamos trabajando aquí con probabilidades discretas en un rango finito, así que estamos viendo (aquí) 5 posibilidades con alguna distribución, llamémoslas p1, p2, p3, p4 y P5 la suma de los cuales es 1.

f0 = 0 f1 = p1 f2 = f1 + p2 F3 = F2 + p3 f4 = f3 + p4 f5 = f4 + P5 y debe ser 1

Genere un número aleatorio de 0 a 1 y supondremos que no puede ser exactamente 1. Mire el valor f que se ajusta a su techo y ese es el valor de su evento aleatorio Así que tal vez

f1 = f2 = 0,222 0,444 f3 = 0,555 f4 f5 = 0,777 = 1

Si el número aleatorio se 0,645 luego de haber generado un evento de 4. Con lo anterior tienes la mitad de posibilidades de generar un 3 que cualquiera de los demás. Podemos hacer que sea menos probable que todavía, por ejemplo:

f1 = f2 = 0,24 0,48 f3 = 0.52 = 0.76 f4 f5 = 1

0,24 probablemente de los otros y sólo 0,04 de un 3.

+0

Esta solución parece prometedora, pero su explicación es confusa. ¿Puedes explicar la forma en que determinas qué valor se selecciona? La razón por la que me gusta esta respuesta es que minimiza los cálculos involucrados (los valores aleatorios siempre se generan entre 0.0 y 1.0), y solo requiere que se almacene un valor por tipo de resultado. –

+0

Esto es elegante, pero requiere dobles y una búsqueda binaria a través del conjunto de valores de corte. No es el fin del mundo, sino una consideración de rendimiento. Sin embargo, los dobles son buenos de otra manera: más fáciles de establecer y comprender que los cálculos múltiples comunes del enfoque de Merlyn. –

+0

Sí, sería relativamente lento, una forma más rápida es crear una tabla estática. Tal vez tenemos 256 valores en la tabla estática, cada uno de los cuales contiene un número del 1 al 5, y usted elige un número aleatorio de 0 a 255 y luego busca en la tabla con qué valor se relaciona. – CashCow

1

Vamos a pasar por esto. Primero usamos la función srand() para inicializar el aleatorizador. Básicamente, la computadora puede generar números aleatorios basados ​​en el número que se alimenta a srand().Si diera el mismo valor de inicialización, entonces se generarían los mismos números aleatorios cada vez.

Por lo tanto, tenemos que sembrar el aleatorizador con un valor que siempre está cambiando. Hacemos esto al alimentarlo con el valor de la hora actual con la función de tiempo().

Ahora, cuando llamemos a rand(), se producirá un nuevo número aleatorio cada vez.

#include<stdio.h> 
int random_number(int min_num, int max_num); 

int main(void) { 
    printf("Min : 1 Max : 30 %d\n",random_number(0,5)); 
    printf("Min : 100 Max : 1000 %d\n",random_number(100,1000)); 
    return 0; 
} 

int random_number(int min_num, int max_num) 
{ 
    int result=0,low_num=0,hi_num=0; 
    if(min_num<max_num) 
    { 
     low_num=min_num; 
     hi_num=max_num+1; // this is done to include max_num in output. 
    }else{ 
     low_num=max_num+1;// this is done to include max_num in output. 
     hi_num=min_num; 
    } 

    srand(time(NULL)); 
    result = (rand()%(hi_num-low_num))+low_num; 
    return result; 
} 
Cuestiones relacionadas