Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 25.05.2017
Сообщений: 28
1

Конгруэнтный ГПЧ. Задача: подобрать формулу, чтобы в листбоксе и гистограмме числа распределялись равномерно

24.04.2018, 16:12. Показов 1017. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Так-то все кошерно работает, только единица выпадает намного чаще. При 100 000-чах прогонов, повторений одного числа может быть по 100 раз подряд, а нужно чтобы был полный рандом. Что-то совсем не получается((((

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace kursovoy
{
/*
* Реализовать генератор псевдослучайных чисел на основе линейного конгруэнтного метода 
* для виртуальной игральной кости (кубика). Используя различные значения констант, 
* проверить качество получаемой равнораспределённой случайной величины с помощью гистограммы распределения её значений.
*/
public partial class Form1 : Form
{
long[] mas_X; 
 
public Form1()
{
InitializeComponent(); 
ResetValues(); 
}
 
 
private void num_m_ValueChanged(object sender, EventArgs e) 
 
{
 
this.num_Xp.Value = 1;
this.num_Xp.Maximum = num_m.Value;
 
 
 
}
 
private void button1_Click_1(object sender, EventArgs e)
{
long X = Convert.ToInt64(num_Xp.Value);
long m = Convert.ToInt64(num_m.Value);
long a = Convert.ToInt64(num_a.Value);
long C = Convert.ToInt64(num_c.Value);
 
X = Play(X, m, a, C);
lb_last_val.Items.Insert(0, X);
 
 
mas_X[X]+= 1;
 
 
num_Xp.Value = X;
UpdateChart();
}
 
private long Play(long Xp, long m, long a, long C )
{
 
 
Random rnd = new Random();
 
return ((a * Xp + C) % m) / rnd.Next(1, 7) % 6 + 1;
 
 
 
 
 
}
 
private void btn_play_x5_Click(object sender, EventArgs e)
{
 
long X = Convert.ToInt64(num_Xp.Value);
long m = Convert.ToInt64(num_m.Value);
long a = Convert.ToInt64(num_a.Value);
long C = Convert.ToInt64(num_c.Value);
for (int i = 0; i <= 10000; i++)
{
X = Play(X, m, a, C);
lb_last_val.Items.Insert(0 , X);
 
 
mas_X[X] += 1;
}
 
num_Xp.Value = X ;
UpdateChart();
}
 
private void UpdateChart()
{
for (long i = 0; i < 7; i++) 
{
gistogram.Series[0].Points.AddXY(i + 0 , this.mas_X[i]);
}
}
 
private void ResetValues()
{
mas_X = new long[100000];
 
 
num_m.Value = 4294967296;
 
num_a.Value = 214013;
num_c.Value = 2531011;
 
 
gistogram.Series[0].Points.Clear();
 
 
lb_last_val.Items.Clear();
}
 
private void button1_Click(object sender, EventArgs e)
{
ResetValues();
}
}
}
Миниатюры
Конгруэнтный ГПЧ. Задача: подобрать формулу, чтобы в листбоксе и гистограмме числа распределялись равномерно  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2018, 16:12
Ответы с готовыми решениями:

Конгруэнтный ГПЧ. Задача: подобрать формулу, чтобы на в листбоксе и гистограмме числа распределялись равномерно
Так-то все кошерно работает, только единица выпадает намного чаще. При 100 000-чах прогонов,...

Подобрать к числам коэффициенты (как можно меньшие) чтобы числа с коэффициентами сравнялись
Подскажите как реализовать простой подбор в программе. есть два числа и нужно подобрать к...

Подскажите формулу для преобразования равномерно-распределенных случайных чисел в гауссово-распределенные
Собственно, случайные числа с равномерным распределением получил, теперь нужно их конвертировать в...

Какую подобрать формулу?
Задание: Подсчитать количество товара с минимальной ценой и количество товара с максимальной ценой....

8
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
24.04.2018, 16:16 2
Сделайте rnd полем класса, чтобы он был один для всех вызовов метода Play.
1
0 / 0 / 1
Регистрация: 25.05.2017
Сообщений: 28
24.04.2018, 16:19  [ТС] 3
Вот в этом месте надо что-то сделать - return ((a * Xp + C) % m) / rnd.Next(1, 7) % 6 + 1;

(a * Xp + C) % m) - это конгруэнтный метод, он тут такой и нужен (a, c и m константы!) и из получившегося числа, а получаются там такие числа 54742,000376554645 надо реализовать генератор полностью рандомного числа от 1 до 6 (стороны кубика). Вывод в листбокс и гистограмму я кое-как настроил, слава Ситису. Дедлайн сгорает, а ничего лучше этого я не придумал, и оно не работает как надо
0
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
24.04.2018, 16:24 4
Попробуйте как я сказал. Random - это тоже генератор ПСЕВДО случайных чисел. То как вы написали, у вас генерирует не случайную последовательность. Если rnd будет один на всех, то случайность повысится и соответственно ваши выходные данные будут "чище"
1
0 / 0 / 1
Регистрация: 25.05.2017
Сообщений: 28
24.04.2018, 16:31  [ТС] 5
Я вас правильно понял?
C#
1
2
3
4
5
6
7
8
9
10
public partial class Form1 : Form
    {
        long[] mas_X;
        Random rnd = new Random();
 
        public Form1()
        {
            InitializeComponent(); 
            ResetValues(); 
        }
Добавлено через 57 секунд
Я вас правильно понял?
C#
1
2
3
4
5
6
7
8
9
10
public partial class Form1 : Form
    {
        long[] mas_X;
        Random rnd = new Random();
 
        public Form1()
        {
            InitializeComponent(); 
            ResetValues(); 
        }
0
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
24.04.2018, 16:32 6
Да.
Тогда Play:
C#
1
2
3
4
private long Play(long Xp, long m, long a, long C )
{
     return ((a * Xp + C) % m) / rnd.Next(1, 7) % 6 + 1;
}
1
0 / 0 / 1
Регистрация: 25.05.2017
Сообщений: 28
24.04.2018, 16:41  [ТС] 7
Я поверить не могу, но это действительно помогло. Спасибо большущее, я сам никогда и подумать о таком не смог бы. Во дела. Я бы еще спросить хотел, как думаете, такое распределение на гистограмме сойдет за рандом? Препод сказал - "более-менее равномерное распределение". Это можно назвать таковым?
Миниатюры
Конгруэнтный ГПЧ. Задача: подобрать формулу, чтобы в листбоксе и гистограмме числа распределялись равномерно  
0
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
24.04.2018, 16:43 8
хз... но я понимаю, что вы уже успели с формулой поиграться... попробуйте еще это поделать. или покурите Random. Ему в качестве аргумента в конструктор можно передавать зерно.
1
170 / 91 / 71
Регистрация: 10.05.2014
Сообщений: 432
24.04.2018, 17:56 9
Цитата Сообщение от kompashka Посмотреть сообщение
Препод сказал - "более-менее равномерное распределение". Это можно назвать таковым?
kompashka, проведи аппроксимирующую линию и сам ответь на свой вопрос. Если совсем "более-менее", то норм, а если по-правильному, то это маловероятно, тк идет полнейший рандом. Так что препод не должен придираться.

Можешь, конечно, перестраховаться и просчитать все выпавшие значения по формуле нормального распределения. Тогда препод точно придраться не сможет=)

Добавлено через 5 минут
Для ориентира в вычислениях можешь отталкиваться от этого кода, он, правда, на питоне, но сложного там ничего нет. К тому же у каждой формулы есть описание в виде комментариев.
1
24.04.2018, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2018, 17:56
Помогаю со студенческими работами здесь

Подобрать нужную формулу
Добрый день нужна помощь эксперта. В данной таблице мне нужно сделать. Дата создание документа,...

Задача на формулу полной вероятности и(или) формулу Байеса
По каналу связи передают символы А, В, С с вероятностями 0.4; 0.3; 0.3 соответственно. Вероятность...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru