c# - numeros - Probabilidad de generador de números aleatorios
int aleatorio c# (3)
Puede definir la matriz de distribución (pseudocódigo):
// distribución justa
array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 };
luego tira los dados de 0 a 1, guarda en x y luego haz
float sum = 0;
for (int i = 0; i < 6;i++)
{
sum += array[i];
if (sum > x) break;
}
i es el número de dados.
Ahora si quieres hacer trampa cambia la matriz a:
array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 };
y tendrás un 50% para obtener 6 (en lugar de 16%)
Digamos que estoy escribiendo un juego de suerte simple: cada jugador presiona Enter y el juego le asigna un número aleatorio entre 1-6. Al igual que un cubo. Al final del juego, el jugador con el número más alto gana.
Ahora, digamos que soy un tramposo. Quiero escribir el juego para que el jugador # 1 (que soy yo) tenga una probabilidad del 90% de obtener seis, y el 2% de obtener cada uno de los números restantes (1, 2, 3, 4, 5).
¿Cómo puedo generar un número al azar y establecer la probabilidad para cada número?
Tienes algunas opciones, pero una forma sería sacar un número entre 1 y 100, y usar tus pesos para asignarlo a un número de cara de dado.
Asi que
1,2 = 1
3,4 = 2
5,6 = 3
7,8 = 4
9,10 = 5
11-100 = 6
esto le daría las proporciones que necesita, y también sería bastante fácil de ajustar más tarde.
static Random random = new Random();
static int CheatToWin()
{
if (random.NextDouble() < 0.9)
return 6;
return random.Next(1, 6);
}
Otra forma personalizable de hacer trampa:
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;
}