Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945

Различные данные при автоматическом выполнении программы и при пошаговом

22.05.2019, 09:18. Показов 1640. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть небольшой кусок кода. Если выполнять программу в пошаговом режиме то массивы имеют различные значения. Если выполнять просто через F5, то массивы имеют одинаковые значения. В чем может быть проблема?
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
        static int[] Input(int var)
        {
            int[] arr = new int[var];
            Random rnd = new Random();
            for (int i = 0; i < arr.Length; i++)
                arr[i] = rnd.Next(1, 10);
            return arr;
        }
        static void Print(int[] arr)
        {
            foreach (int var in arr)
                Console.Write("{0,3}", var);
        }
        static void Main(string[] args)
        {
            Console.Write("Введите размерность массивов A и B: ");
            int a1 = int.Parse(Console.ReadLine());
            Console.Write("Введите размерность массива C и D: ");
            int b1 = int.Parse(Console.ReadLine());
            int[] a = Input(a1);
            int[] b = Input(a1);
            int[] c = Input(b1);
            int[] d = Input(b1);
            Console.WriteLine("Исходный массив A:");
            Print(a);
            Console.WriteLine("\nИсходный массив B:");
            Print(b);
            Console.WriteLine("\nИсходный массив C:");
            Print(c);
            Console.WriteLine("\nИсходный массив D:");
            Print(d);
            Console.ReadKey();
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2019, 09:18
Ответы с готовыми решениями:

Пропуск строк кода при пошаговом выполнении программы
У меня есть некоторый код: repeat int := h * sum; sum := 0; h := (b - a) / n; for i := 1 to n do ...

Ошибка при пошаговом выполнении программы. Enternal Error EVA-1425
При пошаговом выполнении программы возникает следующая ошибка: Возникает при наведении курсора на переменную при попытке узнать её...

Почему программа выдает одинаковые значения при обычном запуске и разные при пошаговом выполнении?
почему когда компилирую программу, в двух массивах значения всегда одинаковые... Однако, если прогоняю пошагово программу через F11, то...

17
Эксперт .NET
 Аватар для Rius
13114 / 7675 / 1674
Регистрация: 25.05.2015
Сообщений: 23,411
Записей в блоге: 14
22.05.2019, 09:24
Лучший ответ Сообщение было отмечено Talamaur как решение

Решение

Random надо создавать только единожды в программе. А не каждый раз, как понадобится.
2
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
22.05.2019, 12:05
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
        static Random rnd;
        static int[] Input(int var)
        {
            int[] arr = new int[var];
            
            for (int i = 0; i < arr.Length; i++)
                arr[i] = rnd.Next(1, 10);
            return arr;
        }
        static void Print(int[] arr)
        {
            foreach (int var in arr)
                Console.Write("{0,3}", var);
        }
        static void Main(string[] args)
        {
            rnd = new Random();
            Console.Write("Введите размерность массивов A и B: ");
            int a1 = int.Parse(Console.ReadLine());
            Console.Write("Введите размерность массива C и D: ");
            int b1 = int.Parse(Console.ReadLine());
            int[] a = Input(a1);
            int[] b = Input(a1);
            int[] c = Input(b1);
            int[] d = Input(b1);
            Console.WriteLine("Исходный массив A:");
            Print(a);
            Console.WriteLine("\nИсходный массив B:");
            Print(b);
            Console.WriteLine("\nИсходный массив C:");
            Print(c);
            Console.WriteLine("\nИсходный массив D:");
            Print(d);
            Console.ReadKey();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
22.05.2019, 12:10
uzhsoft, инициализировать надо сразу в объявлении, а не при вызове метода!
C#
1
        static Random rnd = new Random();
1
 Аватар для JustinTime
964 / 582 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
22.05.2019, 12:25
Элд Хасп, Синтаксис позволяет писать по разному, главное инициализоровать переменную перед первым использованием. А остальное дело вкуса. Лично я бы писал так:
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
         static int[] Input(int var, Random rnd)
        {
            int[] arr = new int[var];
            
            for (int i = 0; i < arr.Length; i++)
                arr[i] = rnd.Next(1, 10);
            return arr;
        }
        static void Print(int[] arr)
        {
            foreach (int var in arr)
                Console.Write("{0,3}", var);
        }
        static void Main(string[] args)
        {
            Console.Write("Введите размерность массивов A и B: ");
            int a1 = int.Parse(Console.ReadLine());
            Console.Write("Введите размерность массива C и D: ");
            int b1 = int.Parse(Console.ReadLine());
            var rnd = new Random();
            int[] a = Input(a1, rnd);
            int[] b = Input(a1, rnd);
            int[] c = Input(b1, rnd);
            int[] d = Input(b1, rnd);
            Console.WriteLine("Исходный массив A:");
            Print(a);
            Console.WriteLine("\nИсходный массив B:");
            Print(b);
            Console.WriteLine("\nИсходный массив C:");
            Print(c);
            Console.WriteLine("\nИсходный массив D:");
            Print(d);
            Console.ReadKey();
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
22.05.2019, 12:36
Цитата Сообщение от uzhsoft Посмотреть сообщение
Синтаксис позволяет писать по разному, главное инициализоровать переменную перед первым использованием.
Данная ошибка вызвана тем, что происходит инициализация Random в каждом вызове метода.
Перенос инициализации из метода Input в метод Main концептуально ничего не решает. Только переносит место возникновения ошибки из одного метода в другой.

Да, в данном случае, Вы вызываете метод Main один раз и поэтому ошибка не возникает, но это частный случай. В целом такой подход не исправляет ошибку, а использует особенность работы частного алгоритма вызова метода.

Так же здесь нарушается независимость методов. Переменная rnd - это статическая переменная уровня класса. Используется она только в методе Input. Так с какой стати метод Main лезет туда? Это его совершено не касается!

Если уж так хочется инициализировать поле не напрямую, а в методе, то делать это надо в статическом конструкторе.
Но, на мой взгляд, это избыточно.
C#
1
2
3
4
5
6
7
    class Program
    {
        static Random rnd;
        static Program()
        {
            rnd = new Random();
        }
0
119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945
22.05.2019, 14:51  [ТС]
Элд Хасп, Я Вашу мысль правильно понял, что вот эту строку стоит просто прописать в классе где находится метод Input, т.е. просто сделать как поле типа static?
C#
1
static Random rnd = new Random();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
22.05.2019, 16:34
Цитата Сообщение от Talamaur Посмотреть сообщение
просто сделать как поле типа static?
Совершенно верно.
Это типовой подход для реализации ГСЧ.
0
119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945
22.05.2019, 20:00  [ТС]
Элд Хасп, а можно пожалуйста расшифровать ГСЧ?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.05.2019, 20:06
Цитата Сообщение от Talamaur Посмотреть сообщение
ГСЧ
генератор случайных чисел
первый ответ в гугле если что
1
119 / 84 / 42
Регистрация: 14.12.2015
Сообщений: 945
18.06.2019, 10:14  [ТС]
Цитата Сообщение от Talamaur Посмотреть сообщение
т.е. просто сделать как поле типа static
Элд Хасп, а для каждого класса можно создать свой объект типа Random в одном пространстве имен? И это не будет ли ошибкой? Например:
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
namespace MyNamespace
{
class MyClass1
{
static Random rnd = new Random();
//методы
}
class MyClass2
{
static Random rnd = new Random();
//методы
}
class MyClass3
{static Random rnd = new Random();
//методы
}
class Program
{
static void Main(string[] args)
{
//код программы
}
}
}
0
Эксперт .NET
 Аватар для Rius
13114 / 7675 / 1674
Регистрация: 25.05.2015
Сообщений: 23,411
Записей в блоге: 14
18.06.2019, 10:28
Это не ошибка. Если между созданием random и получением числа от него проходит одинаковое время, то результат он выдаёт одинаковый. Исходите из этого.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
18.06.2019, 10:29
Цитата Сообщение от Talamaur Посмотреть сообщение
а для каждого класса можно создать свой объект типа Random в одном пространстве имен? И это не будет ли ошибкой?
Можно, только зачем? Тогда уж создайте класс StaticRandom и используйте его из всех остальных мест где он требуется...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.06.2019, 10:33
Цитата Сообщение от Rius Посмотреть сообщение
Если между созданием random и получением числа от него проходит одинаковое время, то результат он выдаёт одинаковый.
Генерируемая последовательность зависит только от изначального значения, а не от интервала времени между вызовами Next.
1
Эксперт .NET
 Аватар для Rius
13114 / 7675 / 1674
Регистрация: 25.05.2015
Сообщений: 23,411
Записей в блоге: 14
18.06.2019, 10:44
Действительно. Тогда остаётся если время создания одинаковое, что инициализирует Random в конструкторе по умолчанию.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
18.06.2019, 12:18
Цитата Сообщение от Talamaur Посмотреть сообщение
для каждого класса можно создать свой объект типа Random в одном пространстве имен? И это не будет ли ошибкой? Например:
Создание Random обходится дорого, чего согласно документации надо избегать https://docs.microsoft.com/ru-... antiations. Поэтому, если нет опасности конфликтов из-за многопоточности, то самый простой вариант - это статическое поле для чтения.

В Вашем примере если статические поля rnd в разных классах будут инициализированы одновременно (по-моему, в пределах ~20мс), то они будут выдавать одинаковые последовательности. Насколько это вероятно, и насколько это может отрицательно повлиять на работу приложения надо разбираться отдельно в каждом конкретном случае.

В зависимости от предъявляемых в конкретном приложении требований к ГСЧ: многопоточность, очень частые вызовы (чаще чем справляется один экземпляр ГСЧ), гарантия разной инициализации в разных типах и т.д, - надо создавать и разные реализации ГСЧ.

Статическое поле в типе обеспечивает случайные числа для каждого экземпляра типа, даже если они создаются последовательно за очень короткое время. Но может создать коллизии при его использовании в многопоточном приложении.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
18.06.2019, 12:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но может создать коллизии при его использовании в многопоточном приложении.
Не просто может, а будет... При вызове из разных потоков согласно документации генерируются нули.

https://docs.microsoft.com/ru-... readSafety
If you don't ensure that the Random object is accessed in a thread-safe way, calls to methods that return random numbers return 0.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
18.06.2019, 12:44
Цитата Сообщение от Someone007 Посмотреть сообщение
Не просто может, а будет... При вызове из разных потоков согласно документации генерируются нули.
Тем более.
Не знал об этом. Думал просто могут быть какие-то исключения если обращения к экземпляру будет единовременно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.06.2019, 12:44
Помогаю со студенческими работами здесь

Как сохранить данные в ОЗУ которые при выполнении программы изменяются в компонентах?
Привет всем, помогите с вопросом: как сохранить данные в ОЗУ которые при выполнении программы изменяются в компонентах? Допустим нужно в...

Различные результаты при выполнении цикла
Доброго всем утра! Суть проблемы такова: возникла необходимость переписать прогу с Delphi на Java. Имелся такого вида цикл: counter...

Что будет выведено на экран при выполнении следующей программы при n = 5 ?
Пожалуйста, очень прошу помогите с тестами(( 3)Что будет выведено на экран при выполнении следующей программы при n = 5 ? ...

При передачи указателя на объект vector в качестве параметра при выполнении программы происходит ошибк сегметирования
Доброго всем времени суток. Помогите понять, почему происходит такая ситуация. ОС Linux Mint Используется clang Имеется код: ...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru