Advertisement
luk_per

Untitled

May 22nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.76 KB | None | 0 0
  1. using System;
  2.  
  3.  
  4. namespace SymulacjaCyfrowa
  5. {
  6.     internal class Generator
  7.     {
  8.         private int a = 16807;
  9.          private int q = 127773;
  10.          private int r = 2836;
  11.        /* private int a = 69621;
  12.         private int q = 30845;
  13.         private int r = 23902;*/
  14.         private int max = 2147483647;
  15.      
  16.         public enum Operator
  17.         {
  18.             NormalOrder,
  19.             PatientAppearance,
  20.             Transfusion,
  21.             EmergencyOrder,
  22.             DonorAppearance,
  23.             PassBlood
  24.         }
  25.  
  26.        /* public Generator(Operator op)
  27.         {
  28.             switch (op)
  29.             {
  30.                 case Operator.NormalOrder:
  31.                     Output = 123;
  32.                     break;
  33.                 case Operator.PatientAppearance:
  34.                     Output = 30;
  35.                     break;
  36.                 case Operator.Transfusion:
  37.                     Output = 3;
  38.                     break;
  39.                 case Operator.EmergencyOrder:
  40.                     Output = Convert.ToInt32 (Normal(300,0.1));
  41.                     break;
  42.                 case Operator.DonorAppearance:
  43.                     Output = 40;
  44.                     break;
  45.                 case Operator.PassBlood:
  46.                     Output = UniformAB(5,10);
  47.                     break;
  48.                 default:
  49.                     throw new InvalidOperationException("Nieprawidłowe zapytanie do generatora: " + op);
  50.             }
  51.         }*/
  52.  
  53.  
  54.         private double Uniform(ref int seed)
  55.         {
  56.             int h;
  57.             //via ivocom
  58.             h = seed / q;
  59.             seed = a * (seed - q * h) - r * h;
  60.             if (seed < 0) { seed = seed + max; }
  61.             return seed;
  62.         }
  63.         public double UniformZO(ref int seed) { return (Uniform(ref seed) / max); } //rozkład równomierny (0,1)
  64.         public double UniformAB(int A, int B,ref int seed) { return (A +UniformZO(ref seed) * (B - A)); } //rozkład równomierny w przedziale (A,B)
  65.        /* public double Normal()
  66.         {
  67.             return 300;
  68.  
  69.         }*/
  70.  
  71.        public double Normal(double s, double w, ref int seed)
  72.         {
  73.             double x = 0;
  74.             for (int i = 0; i < 12; i++)
  75.             {
  76.                 x += UniformZO(ref seed);
  77.             }
  78.             x -= 6;
  79.             return x * w + s;
  80.         }
  81.         public double Geometric(double lambda, ref int seed)
  82.         {
  83.             return Math.Floor(-Math.Log(UniformZO(ref seed))/lambda);
  84.             //return (Math.Log(Uniform(ref seed)) / Math.Log(lambda));
  85.         }
  86.  
  87.         public double Exponential(double lambda, ref int seed)
  88.         {
  89.             return -Math.Log(UniformZO(ref seed)) / lambda;
  90.         }
  91.  
  92.         //public double Output { get; set; }
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement