2010-06-10 19 views
16

Digamos que estoy escribiendo un juego simple de suerte: cada jugador presiona Enter y el juego le asigna un número aleatorio entre 1-6. Como un cubo Al final del juego, gana el jugador con el número más alto.Generador de números aleatorios de probabilidad

Ahora, digamos que soy un tramposo. Quiero escribir el juego para que el jugador n. ° 1 (que será yo) tenga una probabilidad del 90% de obtener seis, y del 2% obtener cada uno de los números de descanso (1, 2, 3, 4, 5).

¿Cómo puedo generar un número aleatorio y establecer la probabilidad para cada número?

+3

1 para "digamos que soy un tramposo " –

Respuesta

18
static Random random = new Random(); 

static int CheatToWin() 
{ 
    if (random.NextDouble() < 0.9) 
     return 6; 

    return random.Next(1, 6); 
} 

Otra forma personalizable para engañar:

static int IfYouAintCheatinYouAintTryin() 
{ 
    List<Tuple<double, int>> iAlwaysWin = new List<Tuple<double, int>>(); 
    iAlwaysWin.Add(new Tuple<double, int>(0.02, 1)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.04, 2)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.06, 3)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.08, 4)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.10, 5)); 
    iAlwaysWin.Add(new Tuple<double, int>(1.00, 6)); 

    double realRoll = random.NextDouble(); // same random object as before 
    foreach (var cheater in iAlwaysWin) 
    { 
     if (cheater.Item1 > realRoll) 
      return cheater.Item2; 
    } 

    return 6; 
} 
+1

es poco personalizable – Andrey

+2

Oh, claro, una * forma * personalizable de hacer trampa. Añadiré uno. –

+1

@Andrey: Y sin embargo, dado que no es un seudocódigo, no es una pseudo respuesta. :) – MusiGenesis

3

Usted tiene algunas opciones, pero una forma habría que tirar un número entre 1 y 100, y utilizar sus pesos para asignar que a un dado número de cara

Así

1,2 = 1 
3,4 = 2 
5,6 = 3 
7,8 = 4 
9,10 = 5 
11-100 = 6 

esto habría que dar las relaciones que necesita, y también sería bastante fácil de sintonizar más tarde.

+1

Este es el enfoque más simple y más común. A veces se lo llama * vector de distribución de probabilidad *. En la práctica, la mayoría de las implementaciones usan un diccionario de rango y realizan una búsqueda en función de un valor generado aleatoriamente. – LBushkin

2

puede definir gama de distribución (pseudocódigo):

// distribución justa

array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 }; 

luego rodar los dados de 0 a 1, salvo para x y luego hacer

float sum = 0; 
for (int i = 0; i < 6;i++) 
{ 
    sum += array[i]; 
    if (sum > x) break; 
} 

Yo soy el número de dados.

Ahora, si quieres hacer trampa cambio de matriz a:

array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 }; 

y tendrá un 50% para obtener 6 (en lugar del 16%)

Cuestiones relacionadas