Advertisement
luk_per

Untitled

May 24th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.83 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.  
  66.        public double Normal(double s, double w, ref int seed)
  67.         {
  68.             double x = 0.0;
  69.             for (int i = 0; i < 12; i++)
  70.             {
  71.                 x += UniformZO(ref seed);
  72.             }
  73.             x -= 6;
  74.             return x * w + s;
  75.         }
  76.         public double Geometric(double lambda, ref int seed)
  77.         {
  78.             //return Math.Floor(-Math.Log(UniformZO(ref seed))/lambda);
  79.             //return (Math.Log(Uniform(ref seed)) / Math.Log(lambda));
  80.             int i = 0;
  81.             while (UniformZO(ref seed) > 1 * lambda) {
  82.                 i++;
  83.             }
  84.             return i + 1;
  85.  
  86.         }
  87.  
  88.         public double Exponential(double lambda, ref int seed)
  89.         {
  90.             return -lambda*Math.Log(UniformZO(ref seed));
  91.         }
  92.  
  93.         //public double Output { get; set; }
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement