Advertisement
luk_per

Untitled

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