/// <summary> /// genera un valor aleatorio aplicando la distribucion Poisson /// </summary> /// <param name="lambda"></param> /// <param name="tamanioMuestra"></param> /// <returns></returns> public static double[] generarPoisson(double lambda, int tamanioMuestra) { double[] v; v = new double[tamanioMuestra]; double p = 1; double x = -1; double u = 0; double a = Math.Exp(-lambda); for (int j = 0; j < v.Length; j++) { p = 1; x = 0; do { u = Aleatorio.getInstancia().NextDouble(); p = p * u; x++; } while (p >= a); v[j] = x; } return(v); }
private TimeSpan generarTiempoEntreLlegada() { double lambda = pedidosPorHora / 60d; double tiempoEntreLlegada = (-1 / lambda) * Math.Log(1 - Aleatorio.getInstancia().NextDouble()); return(TimeSpan.FromMinutes(tiempoEntreLlegada)); }
/// <summary> /// genera un valor aleatorio aplicando la distribucion exponencial /// </summary> /// <param name="lambda"></param> /// <param name="tamanioMuestra"></param> /// <returns></returns> public static double[] generarExponencial(double lambda, int tamanioMuestra) { double[] v; v = new double[tamanioMuestra]; double media = 1 / lambda; for (int i = 0; i < v.Length; i++) { v[i] = Math.Round(-media * Math.Log(1 - Aleatorio.getInstancia().NextDouble()), 4); } return(v); }
/// <summary> /// genera dos valores aleatorios aplicando la distribucion normal /// </summary> /// <param name="n"></param> /// <param name="media"></param> /// <param name="desviacion"></param> /// <returns></returns> public static double[] generarNormal(int n, double media, double desviacion) { pi = Math.PI; double[] v; v = new double[n]; int i = 0; while (i < v.Length) { double aux1 = Aleatorio.getInstancia().NextDouble() * 1; double aux2 = Aleatorio.getInstancia().NextDouble() * 1; double z1 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Sin(2 * pi * aux2)); double z2 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Cos(2 * pi * aux2)); double variable1 = media + desviacion * (z1); double variable2 = media + desviacion * (z2); v[i] = Math.Round(variable1, 4); v[i + 1] = Math.Round(variable2, 4); i = i + 2; } //for (int i = 0; i < v.Length; i + 2) //{ // double aux1 = r1.NextDouble() * 1; // double aux2 = r2.NextDouble() * 1; // double z1 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Sin(2 * pi * aux2)); // double z2 = Math.Sqrt(-2 * Math.Log(aux1)) * (Math.Cos(2 * pi * aux2)); // double variable1 = media + desviacion * (z1); // double variable2 = media + desviacion * (z2); // v[i] = Math.Round(variable1, 4); // v[i + 1] = Math.Round(variable2, 4); //} return(v); }
public static int generarRandomPoisson(double lambda, int valorInicialX) { double p = 1; int x = valorInicialX; double u = 0; double a = Math.Exp(-lambda); p = 1; x = 0; do { u = Aleatorio.getInstancia().NextDouble(); p = p * u; x++; } while (p >= a); return(x); }
/// <summary> /// genera un valor aleatorio aplicando la distribucion uniforme /// </summary> /// <param name="min"></param> /// <param name="max"></param> /// <returns></returns> public static double generarUniforme(double min, double max) { return(Math.Round(Aleatorio.getInstancia().NextDouble() * (max - min) + min, 4)); }
private Pedido generarPedido(out bool pedidoYaCreado) { pedidoYaCreado = false; //generamos el random para saber a que pedido pertenece Double random = Aleatorio.getInstancia().NextDouble(); Pedido pedido; if (random < 0.2d) { pedido = buscarPedidoDisponible(typeof(PedidoSandwich), 1); if (pedido == null) { //Genero una docena de sanguches pedido = new PedidoSandwich(mediaSandwich, desviacionSandwich); actual.sandwichPreparados++; } else { pedidoYaCreado = true; } } else if (0.2d < random && random < 0.6d) { pedido = buscarPedidoDisponible(typeof(PedidoPizza), 1); if (pedido == null) { //Genero un pedido pizza pedido = new PedidoPizza(a_pizza, b_pizza); actual.pizzasPreparadas++; } else { pedidoYaCreado = true; } } else if (0.6 < random && random < 0.9d) { pedido = new PedidoEmpanadas(mediaEmpanadas); Pedido pedidoAux = buscarPedidoDisponible(typeof(PedidoEmpanadas), pedido.getCantidad()); //genero un pedido de empanadas if (pedidoAux == null) { actual.empanadasPreparadas += pedido.getCantidad(); } else { pedido = pedidoAux; pedidoYaCreado = true; } } else if (0.9d < random && random < 0.95d) { pedido = buscarPedidoDisponible(typeof(PedidoHamburguesa), 1); if (pedido == null) { //Genero un pedido de hamburguesas pedido = new PedidoHamburguesa(); actual.hamburguesasPreparados++; } else { pedidoYaCreado = true; } } else { pedido = buscarPedidoDisponible(typeof(PedidoLomito), 1); if (pedido == null) { //Genero un pedido de lomito pedido = new PedidoLomito(); actual.lomitosPreparados++; } else { pedidoYaCreado = true; } } //asigno nro de pedido y agrego el pedido a la lista de pedidos pedido.numeroPedido = numeroPedido++; pedido.momentoInicio = actual.reloj; actual.pedidos.Add(pedido); return(pedido); }
private Servidor obtenerCocineroMayorTiempoLibre() { Servidor cocineroConMasTiempoLibre = null; List <Servidor> cocinerosLibres = anterior.cocineros.Where(x => x.estadoServidor == EstadoServidor.libre).ToList(); TimeSpan mayorTiempoLibre; List <Servidor> servidoresConTiempoLibre; double aleatorio; switch (cocinerosLibres.Count) { case 1: cocineroConMasTiempoLibre = cocinerosLibres.First(); break; case 2: mayorTiempoLibre = cocinerosLibres.Max(x => x.tiempoLibre); servidoresConTiempoLibre = cocinerosLibres.Where(x => x.tiempoLibre == mayorTiempoLibre).ToList(); if (servidoresConTiempoLibre.Count == 1) { cocineroConMasTiempoLibre = servidoresConTiempoLibre[0]; } else { aleatorio = Aleatorio.getInstancia().NextDouble(); if (aleatorio < 0.5) { cocineroConMasTiempoLibre = cocinerosLibres[0]; } else { cocineroConMasTiempoLibre = cocinerosLibres[1]; } } break; case 3: mayorTiempoLibre = cocinerosLibres.Max(x => x.tiempoLibre); servidoresConTiempoLibre = cocinerosLibres.Where(x => x.tiempoLibre == mayorTiempoLibre).ToList(); if (servidoresConTiempoLibre.Count == 1) { cocineroConMasTiempoLibre = servidoresConTiempoLibre[0]; } else { aleatorio = Aleatorio.getInstancia().NextDouble(); if (servidoresConTiempoLibre.Count == 2) { if (aleatorio < 0.5) { cocineroConMasTiempoLibre = cocinerosLibres[0]; } else { cocineroConMasTiempoLibre = cocinerosLibres[1]; } } else { if (aleatorio < 0.3333) { cocineroConMasTiempoLibre = cocinerosLibres[0]; } else if (aleatorio < 0.6666) { cocineroConMasTiempoLibre = cocinerosLibres[1]; } else { cocineroConMasTiempoLibre = cocinerosLibres[2]; } } } break; default: break; } return(cocineroConMasTiempoLibre); }
private TimeSpan obtenerTiempoEntregaDelivery() { return(TimeSpan.FromMinutes(-mediaDemoraPedido * Math.Log(1 - Aleatorio.getInstancia().NextDouble()))); }