Баг Random или нельзя делать Random в цикле for?

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 496
Благодарностей
1 304
Баллы
113
Доброго времени. Есть снипет:
C#:
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(new Random().Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
}
Мне казалось, он должен 10 раз выдать в лог 10 разных рандомных цифр, но как оказалось - он выдает 10 одинаковых цифр. Не совсем понятно почему, если мы ведь каждый проход в цикле обращаемся как создать - новый рандом, разве нет?

94114
 

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43
Доброго времени. Есть снипет:
C#:
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(new Random().Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
}
Мне казалось, он должен 10 раз выдать в лог 10 разных рандомных цифр, но как оказалось - он выдает 10 одинаковых цифр. Не совсем понятно почему, если мы ведь каждый проход в цикле обращаемся как создать - новый рандом, разве нет?

Посмотреть вложение 94114
Это не баг.
Вам нужно создать объект Random до цикла, а не в цикле
 
  • Спасибо
Реакции: Gunjubasik

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43
C#:
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(rnd.Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
}
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 496
Благодарностей
1 304
Баллы
113

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43
Так, же можно сделать паузу

C#:
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(new Random().Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
    Thread.Sleep(1);
}
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 712
Баллы
113
Это псевдорандом.
таким образом new Random() он всегда генерируется одинаковый. и последовательность у него будет всегда одинаковая во всех потоках.
Выше показали как получить последовательность, а вот если надо получить другую последовательность, отличную от других потоков, то надо использовать его перегрузку
94116


можно в качестве нового Seed использовать текущие тики

C#:
            Thread.Sleep(1);
            int seed = (int) DateTime.Now.Ticks & 0x0000FFFF;
            Random rnd = new Random(seed);
            return rnd.Next(start, end);
 
  • Спасибо
Реакции: Gunjubasik и volody00

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43
Так, же можно сделать паузу

C#:
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(new Random().Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
    Thread.Sleep(1);
}
Т.е. цикл не дает возможность новой генерации?
Генерация зависит от текущего время, а у вас генерируется мгновенно.Поэтому и повторы.
Если сделаете паузу хоть на мс, то повторов не будет
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 231
Благодарностей
667
Баллы
113
Доброго времени. Есть снипет:
C#:
for (int i = 0; i < 10; i++)
{

project.SendToLog(Convert.ToString(new Random().Next(1, 100)), ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true,
        ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Default);
}
Мне казалось, он должен 10 раз выдать в лог 10 разных рандомных цифр, но как оказалось - он выдает 10 одинаковых цифр. Не совсем понятно почему, если мы ведь каждый проход в цикле обращаемся как создать - новый рандом, разве нет?

Посмотреть вложение 94114
Ну такое делать в принципе не надо, вы вызываете объект класса рандом по слабой ссылке , в цикле, таким образом при каждой итерации создается анонимный класс, что нагружает систему.

У меня кстати в vs все нормально работает.
2022-07-07_13-49-53.png
Но лучше все таки создавать экземпляр класса нормальный.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 712
Баллы
113
Ну такое делать в принципе не надо, вы вызываете объект класса рандом по слабой ссылке без выделения места на куче, в цикле, таким образом при каждой итерации создается анонимный класс, что нагружает систему.

У меня кстати в vs все нормально работает.
Посмотреть вложение 94118
Но лучше все таки создавать экземпляр класса нормальный.
а работа в визуал студии немного отличается от работы в кубике C# , тем более в консоли. зенка вносит свои реалии в работу кода.
 

viol2021

Client
Регистрация
12.01.2021
Сообщения
482
Благодарностей
180
Баллы
43

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 489
Благодарностей
3 356
Баллы
113
На будущее ещё стоит учитывать, что рандом нужно синхронизировать, при работе в многопотоке.
 
  • Спасибо
Реакции: Sho и BAZAg

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 231
Благодарностей
667
Баллы
113
а работа в визуал студии немного отличается от работы в кубике C# , тем более в консоли. зенка вносит свои реалии в работу кода.
Реально, провел тесты так сказать) проблема точно в слабой ссылке. Мне кажется что это уже к разрабам вопрос, почему зенка слабые ссылки не переваривает в таком виде.
2022-07-07_14-01-39.png2022-07-07_14-01-12.png
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 489
Благодарностей
3 356
Баллы
113
Ну такое делать в принципе не надо, вы вызываете объект класса рандом по слабой ссылке , в цикле, таким образом при каждой итерации создается анонимный класс, что нагружает систему.

У меня кстати в vs все нормально работает.
Посмотреть вложение 94118
Но лучше все таки создавать экземпляр класса нормальный.
У вас вообще .net 5.0... Это уже даже не Core.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 712
Баллы
113

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 231
Благодарностей
667
Баллы
113

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 489
Благодарностей
3 356
Баллы
113
Перевел на кор 3.1, все так же нормально работает
Тестируйте как минимум под framework 4.6.2 и не под отладкой, она замедляет выполнение - это скрывает проблему.
Собирать надо под Release, а exe запускать самому.
это как, если не секрет ?
Через lock.
Для удобства, можно свой объект-обёртку написать, содержащий рандом и lock.
 
  • Спасибо
Реакции: Sho

Кто просматривает тему: (Всего: 4, Пользователи: 0, Гости: 4)