Генерация непрерывной случайной величины - C#

Узнай цену своей работы

Формулировка задачи:

Нужно сгенерировать методом фон Неймана(методом исключений) непрерывную случайную величину с плотностью как на прикрепленном фото. Нужно сделать на формах. Буду рад любой помощи, почитал литературу и ничего не понял... Надеюсь на вас!

Решение задачи: «Генерация непрерывной случайной величины»

textual
Листинг программы
  1. class MainForm : Form
  2. {
  3.     private Chart _chart;
  4.    
  5.     public MainForm()
  6.     {
  7.         _chart = new Chart { Parent = this, Dock = DockStyle.Fill };
  8.  
  9.         var values = new List<float>();
  10.         var random = new Random();
  11.  
  12.         for (int i = 0; i < 100000; i++)
  13.             values.Add(NextRandom(random, Distribution, 0, 8, 0.25f));
  14.  
  15.         var x = Enumerable.Range(0, 1000).Select(i => 8f / 1000 * i).ToList();
  16.         var y = x.Select(e => values.Count(v => v >= e && v <= e + 8f / 1000)).ToList();
  17.  
  18.         var name = "res";
  19.         _chart.ChartAreas.Add(name);
  20.         _chart.Series.Add(name);
  21.         _chart.Series[name].ChartType = SeriesChartType.Spline;
  22.         _chart.Series[name].Color = Color.Red;
  23.         _chart.Series[name].Points.DataBindXY(x, y);
  24.  
  25.         AddSeries("prob", Color.Blue, Distribution, 0, 8);
  26.     }
  27.    
  28.     private void AddSeries(string name, Color color, Func<float, float> f, float left, float right, float step = 1e-2f)
  29.     {
  30.         _chart.ChartAreas.Add(name);
  31.         _chart.Series.Add(name);
  32.         _chart.Series[name].ChartType = SeriesChartType.Spline;
  33.         _chart.Series[name].Color = color;
  34.        
  35.         var x = new List<float>();
  36.         var y = new List<float>();
  37.        
  38.         for (;left <= right; left += step)
  39.         {
  40.             x.Add(left);
  41.             y.Add(f(left));
  42.         }
  43.        
  44.         _chart.Series[name].Points.DataBindXY(x, y);
  45.     }
  46.    
  47.     private float Distribution(float value)
  48.     {
  49.         value %= 2;
  50.         return value * 0.25f / 2;
  51.     }
  52.    
  53.     private float NextRandom(Random random, Func<float, float> distribution, float min, float max, float maxDistribution)
  54.     {
  55.         while (true)
  56.         {
  57.             var k1 = (float)random.NextDouble();
  58.             var k2 = (float)random.NextDouble();
  59.            
  60.             var derivedK1 = min + (max - min) * k1;
  61.             var derivedK2 = maxDistribution * k2;
  62.            
  63.             if (derivedK2 <= distribution(derivedK1))
  64.                 return derivedK1;
  65.         }
  66.     }
  67. }
  68.  
  69. void Main()
  70. {
  71.     Application.Run(new MainForm());
  72. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы