Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/88: Рейтинг темы: голосов - 88, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 20.05.2015
Сообщений: 31

Random выдает одинаковые значения

30.05.2015, 01:01. Показов 16518. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такая проблема. Есть цикл, который заполняет массив объектов рандомными данными. Но при его работе он заполняет этот массив абсолютно одинаковыми объектами. Однако, если поставить точку останова в момент его исполнения и прощелкать вручную весь цикл, то данные становятся рандомными. С чем это может быть связано?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2015, 01:01
Ответы с готовыми решениями:

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

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

Почему Random генерирует одинаковые числа?
int Do = (int)this.numberDo.Value; //получаем количество символов введенное пользователем int mass = new int ; string ff =...

9
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2015, 01:18
Лучший ответ Сообщение было отмечено pikelson как решение

Решение

Random - класс (System)
Однако, вследствие конечности разрешающей способности часов, использование конструктора без параметров при создании различных объектов Random в быстрой последовательности приводит к созданию генераторов случайных чисел, производящих идентичные числовые последовательности.
Цитата Сообщение от pikelson Посмотреть сообщение
С чем это может быть связано?
Видимо с тем, что во время пошаговой отладки продходит больше времени между итерациями. Но насколько я понимаю, у тебя проблема не в том, что последовательности одинаковые, а в том, что последовательности как таковой нет, вместо этого весь массив заполняется одним значением. Вероятно ты в каждой итерации цикла создаешь новый экземпляр Random. Поскольку времени между их созданием проходит мало и они генерируют одну последовательность, а ты, в свою очередь используешь только первый элемент последовательности, ну вот и результат. Создай экземпляр за пределами цикла, а в цикле вызывай Next (или что ты там вызываешь) у этого экземпляра.
2
0 / 0 / 0
Регистрация: 20.05.2015
Сообщений: 31
30.05.2015, 01:32  [ТС]
Cпасибо, не знал
0
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
05.07.2023, 19:15
Так а если в программе, в методе экземпляра класса, предусмотрен рандом некоего поля этого класса, а экземпляров много и полям нужно присвоить значения, то что делать? Цикл тут дает одинаковый рандом. Конечно как вариант можно пропихнуть экземпляр рандома как параметр метода, но это разве нормально?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
05.07.2023, 19:16
Diom, сделай рандом статическим полем класса
1
2 / 2 / 0
Регистрация: 08.01.2023
Сообщений: 90
05.07.2023, 19:20
Diamante, ага, работает, буду знать. Спасибо.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
05.07.2023, 19:21
Diom, если у вас новый .NET, то используйте Random.Shared.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.07.2023, 19:39
Цитата Сообщение от OwenGlendower Посмотреть сообщение
если у вас новый .NET, то используйте Random.Shared.
Стоит учитывать что при обращении из кучи мест, все дружно будут ждать друг-друга.

Цитата Сообщение от Diom Посмотреть сообщение
Так а если в программе, в методе экземпляра класса, предусмотрен рандом некоего поля этого класса, а экземпляров много и полям нужно присвоить значения, то что делать? Цикл тут дает одинаковый рандом. Конечно как вариант можно пропихнуть экземпляр рандома как параметр метода, но это разве нормально?
Создавать рандом вне цикла. Грубо говоря вместо этого
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
for (var i = 0; i < 100; i++)
{
    _ = new MyClass();
}
 
public class MyClass
{ 
    public int Value { get; set; }
    public MyClass() 
    {
        Value = new Random().Next();
    }
}
У вас должно быть так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
var random = new Random();
for (var i = 0; i < 100; i++)
{
    _ = new MyClass(random.Next());
}
 
public class MyClass
{ 
    public int Value { get; set; }
    public MyClass(int value) 
    {
        Value = value;
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
05.07.2023, 20:26
Цитата Сообщение от Wolfdp Посмотреть сообщение
Стоит учитывать что при обращении из кучи мест, все дружно будут ждать друг-друга.
Почему? Судя по исходному коду у каждого потока свой Random.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.07.2023, 21:12
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Почему? Судя по исходному коду у каждого потока свой Random.
Кажись я понял как я налажал в своих практиках. Через замыкание обращался к одному и тому же потокобезопасному элементу как-то так

C#
1
2
3
4
5
6
var random = Random.Shared;
 
new Thread(() => { 
 //использование именно random
 
});
Ну, и насколько вижу new Random(); не потокобезопасный, и работает чуть шустрее.

C#
1
2
3
4
5
6
7
8
9
var sw = new Stopwatch();
var random = new Random(); //.. -> ~9sec
var random = Random.Shared; //.. -> ~17sec
sw.Start();
for(var i = 0; i < int.MaxValue; i++)
    _ = random.Next();
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
В общем тезис чуть меняю, но остаюсь при своем: с Random.Shared нужно работать аккуратно, а те тупо затыкать им все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2023, 21:12
Помогаю со студенческими работами здесь

Почему Random генерирует одинаковые числа?
Здравствуйте, столкнулся с задачей. Random random = new Random(); for (int i = 0; i &lt; count; i++) { val = calcul.diap(left, right,...

Random генерирует одни и те же значения
вот пример кода: double ran(double a) { Random rand = new Random(); a = rand.NextDouble(); ...

Вставить random значения в переменную типа string
Есть строковая переменная, нужно заменить значения, соответствующие условию на рандомные. Сделал так: ...

enum и Random(Вывод произвольного значения из перечисления)
Здравствуйте! Возник такой вопрос: есть перечисление, скажем enum Names ...

Random выдает одинаковые значения
Random rnd = new Random((int)DateTime.Now.Ticks); вот так инициализируется объект класса используется он следующим образом: for (int...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru