powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Одинаковые числа в массиве после заполнения в цикле
7 сообщений из 7, страница 1 из 1
Одинаковые числа в массиве после заполнения в цикле
    #38483212
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите пожалуйста разобраться с проблемой. Я уже голову сломал и не могу понять в чём причина.
Дело обстоит так, есть пустой массив P типа double, в цикле генерирую случайные числа и заполняю его, и вывожу в ListBox, но массив почему-то заполняется одинаковыми числами. Я не могу понять почему вроде всё правильно, убираю цикл, ставлю заполнение по нажатию кнопки всё работает. Вопрос почему так?
Код: 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.
        const byte numberElem = 8; //кол-во элементов в схеме
        const int dt = 1;
        int j;
        double[] P = new double[20]; //вероятность безотказной работы
        Function func = new Function(numberElem);   //класс генерации случайных чисел

        public Form1()
        {
            InitializeComponent();
        }

        double verOtkaz()
        {
            double fi = 0;

            double[] x = new double[numberElem]; ; //элементы схемы
            
            func.generation();
                        
            //вероятности отказа
            x[0] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 0);
            x[1] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 1);
            x[2] = func.giperExponentFunc(Convert.ToDouble(maskedTextBox1.Text), Convert.ToDouble(textBox4.Text), 2);
            x[3] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 3);
            x[4] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 4);
            x[5] = func.giperExponentFunc(Convert.ToDouble(maskedTextBox1.Text), Convert.ToDouble(textBox4.Text), 5);
            x[6] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 6);
            x[7] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 7);

            fi = Math.Round((1 - StructFunc(x)), 7);

            return fi;
        }

        double StructFunc(double[] x)
        {
            ///<summary>
            /// структурная функция
            ///</summary>
            ///<param name = "x">массив элементов цепи</param>
           
            return (1 -
                    (1 - x[0] * x[1]) *
                    (1 - x[6] * x[7]) *
                    (1 - x[0] * x[4] * x[7]) *
                    (1 - x[6] * x[4] * x[1]) *
                    (1 - x[3] * x[2] * x[1]) *
                    (1 - x[3] * x[5] * x[7]) *
                    (1 - x[0] * x[2] * x[5] * x[7]) *
                    (1 - x[6] * x[5] * x[2] * x[1]) *
                    (1 - x[3] * x[2] * x[4] * x[7]) *
                    (1 - x[3] * x[5] * x[4] * x[1])
                    );
        }

        void button1_Click(object sender, EventArgs e)
        {        
            //построение графика вероятности безотказной работы(ВБР)
            //chart1.Series[0].Points.Clear();

            /*P[j] = verOtkaz();
            listBox1.Items.Add(verOtkaz());
            chart1.Series[0].Points.AddXY(j, P[j]);
            j++;*/

           for (j = 0; j < 20; j += dt)
            {
                //вероятность отказа всей системы:
                P[j] = verOtkaz();
                listBox1.Items.Add(verOtkaz());
                chart1.Series[0].Points.AddXY(j, P[j]);
            }
        }
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38483262
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimasikus,

а можно код генератора
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38483421
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimasikus,

авторP[j] = verOtkaz();
listBox1.Items.Add(verOtkaz());


если verOtkaz() - это твой случайный генератор, то в listBox1.Items и в P[j] будут жеж разные значения. Ну правда к твоей проблеме это не относится, так, на будущее подумать.
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38483694
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот класс генератора
Код: 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.
\
 class Function
    { 
        ///<summary>
        ///класс генерации случаянных чисел
        ///</summary>
        ///<param name ="quantElem">кол-во элементов в цепи (от 0 до 255)</param>
        
        private double[] r1;    //массив псевдослучаянных чисел
        private double[] r2;    //массив псевдослучаянных чисел
        private byte quantElem; 

        public Function(byte q)
        {
            /// <summary>
            /// конструктор класса
            /// </summary>
            /// <param name = "numberElem">количество элементов в цепи</param>

            quantElem = q;
        }

        public void generation()
        {
            ///<summary>
            ///генерация псевдослучаянных чисел
            ///</summary>
            /// <param name = "numberElem">количество элементов в цепи</param>
            
            Random rand = new Random();     //генератор псевдослучаянных чисел  
            r1 = new double[quantElem];    //создание массива псевдослучаянных чисел
            r2 = new double[quantElem];    //создание массива псевдослучаянных чисел
            
            // заполнение массивов псевдослучаянными числами
            for (int i = 0; i < quantElem; i++)
            {
                r1[i] = rand.NextDouble();
                r2[i] = rand.NextDouble();
            }
        }
                
        public double maxValueFunc(double lamda, byte numberElem)
        {
            ///<summary>
            ///распределение максимального значения
            ///</summary>
            ///<param name = "lamda">параметр лямда(параметр масштаба)</param>
            ///<param name = "numberElem">номер элемента, для которого вычисляется случаянная величина</param>

            int n = r1.Length;  //число элементов массива псевдослучаянных чисел
            double mu = 0;      //мода
            double x;           //случаянное число
            double r;           //значение распределения

            // вычисление моды(среднее) //
            for (int i = 0; i < n; i++)
            {
                mu += r1[i];
            }

            mu /= n;
            // ------ //
            
            x = (mu - lamda * Math.Log(-Math.Log(r1[numberElem]))); //генерация случаяного числа

            r = Math.Round((Math.Exp(-Math.Exp(-(x - mu) / lamda))), 3);

            return r; 
        }

        public double exponentFunc(double lamda, byte numberElem)
        {
            ///<summary>
            ///экспоненциальное распределение
            ///</summary>
            ///<param name = "lamda">параметр лямда(параметр масштаба)</param>
            ///<param name = "numberElem">номер элемента, для которого вычисляется случаянная величина</param>

            double x;   //случаеное число
            double r;   //значение распределения

            x = ((-1 / lamda) * Math.Log(r1[numberElem]));  //генерация случаяного числа

            r = Math.Round((1 - Math.Exp(-lamda * x)), 3);

            return r;
        }

        public double giperExponentFunc(double lamda, double ro, byte numberElem)
        {
            ///<summary>
            ///гиперэкспоненциальное распределение
            ///</summary>
            ///<param name = "lamda">параметр лямда(параметр масштаба)</param>
            ///<param name = "ro">параметр ро(параметр формы, ро больше 0, но меньше 0.5) </param>
            ///<param name = "numberElem">номер элемента, для которого вычисляется случаянная величина</param>

            double x;   //случаяное число
            double r;   //значение распределения

            //генерация случаяного числа
            if(r1[numberElem] < ro)
            {
                x = ((-1/(2 * ro * lamda)) * Math.Log(r2[numberElem]));
            }
            else
            {
                x = ((-1/(2 * (1 - ro) * lamda)) * Math.Log(r2[numberElem]));
            }

            r = Math.Round((1 - ro * Math.Exp(-2 * ro * lamda * x) - (1 - ro) * Math.Exp(-2 * (1 - ro) * lamda * x)), 3);

            return r;
        }
    }
}
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38483817
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это решит проблему
Код: c#
1.
static Random rand = new Random();
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38483843
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public void generation(int initRnd)
        {
            ///<summary>
            ///генерация псевдослучаянных чисел
            ///</summary>
            /// <param name = "numberElem">количество элементов в цепи</param>
            
            Random rand = new Random(initRnd);     //генератор псевдослучаянных чисел  
            r1 = new double[quantElem];    //создание массива псевдослучаянных чисел
            r2 = new double[quantElem];    //создание массива псевдослучаянных чисел
            
            // заполнение массивов псевдослучаянными числами
            for (int i = 0; i < quantElem; i++)
            {
                r1[i] = rand.NextDouble();
                r2[i] = rand.NextDouble();
            }
        }



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
double verOtkaz(int initRnd)
        {
            double fi = 0;

            double[] x = new double[numberElem]; ; //элементы схемы
            
            func.generation(initRnd);
                        
            //вероятности отказа
            x[0] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 0);
            x[1] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 1);
            x[2] = func.giperExponentFunc(Convert.ToDouble(maskedTextBox1.Text), Convert.ToDouble(textBox4.Text), 2);
            x[3] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 3);
            x[4] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 4);
            x[5] = func.giperExponentFunc(Convert.ToDouble(maskedTextBox1.Text), Convert.ToDouble(textBox4.Text), 5);
            x[6] = func.exponentFunc(Convert.ToDouble(maskedTextBox1.Text), 6);
            x[7] = func.maxValueFunc(Convert.ToDouble(maskedTextBox1.Text), 7);

            fi = Math.Round((1 - StructFunc(x)), 7);

            return fi;
        }


и вызов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void button1_Click(object sender, EventArgs e)
        {        
            //построение графика вероятности безотказной работы(ВБР)
            //chart1.Series[0].Points.Clear();

            /*P[j] = verOtkaz();
            listBox1.Items.Add(verOtkaz());
            chart1.Series[0].Points.AddXY(j, P[j]);
            j++;*/

           for (j = 0; j < 20; j += dt)
            {
                //вероятность отказа всей системы:
                P[j] = verOtkaz(j);
                listBox1.Items.Add(verOtkaz(j));
                chart1.Series[0].Points.AddXY(j, P[j]);
            }
        }
...
Рейтинг: 0 / 0
Одинаковые числа в массиве после заполнения в цикле
    #38484037
dimasikus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое, спасибо. Только вопрос а почему было так?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Одинаковые числа в массиве после заполнения в цикле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]