C# рандом отдает одинаковое значение

systema

Client
Регистрация
25.07.2013
Сообщения
174
Благодарностей
64
Баллы
28
Всем привет.
Не знай баг ли это, или так оно и должно работать.
В проекте ставлю
C#:
Random rnd = new Random();
int a = rnd.Next(100, 250);
return a;
И если во втором кубике поставлю
C#:
Random rnd = new Random();
int b = rnd.Next(100, 250);
return b;
В мэйкере всегда отдает разные значения, а в зенке несколько запусков разные значения

113033

А потом идет одно и тоже

113034

Как сделать чтобы разные значения были?
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 234
Благодарностей
804
Баллы
113
Самое простое, поставь паузу несколько милисекунд между ними. Thread.Sleep(5);
 
  • Спасибо
Реакции: systema

Wadim

Client
Регистрация
14.08.2022
Сообщения
32
Благодарностей
23
Баллы
8
Почитай как устроен рандом, из-за малого временного промежутка выдает одно и тоже значение, делай как сказали выше, небольшую паузу
 
  • Спасибо
Реакции: systema

systema

Client
Регистрация
25.07.2013
Сообщения
174
Благодарностей
64
Баллы
28

Ахилес

Client
Регистрация
11.11.2020
Сообщения
849
Благодарностей
344
Баллы
63
Всем привет.
Не знай баг ли это, или так оно и должно работать.
В проекте ставлю
C#:
Random rnd = new Random();
int a = rnd.Next(100, 250);
return a;
И если во втором кубике поставлю
C#:
Random rnd = new Random();
int b = rnd.Next(100, 250);
return b;
В мэйкере всегда отдает разные значения, а в зенке несколько запусков разные значения

Посмотреть вложение 113033

А потом идет одно и тоже

Посмотреть вложение 113034

Как сделать чтобы разные значения были?
надо генерировать псевдо-рандом с другим системным тиком.

113035
 
  • Спасибо
Реакции: systema

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 371
Благодарностей
3 295
Баллы
113
Вы его каждый раз создаёте в каждом сниппете, а начальное значение у него внутри - тупо время создания.
Необходимо создавать его в общем коде, а Next обернуть в lock (так же в общем коде), что бы каждый поток мог безопасно его использовать (random не потокобезопасен).
 
  • Спасибо
Реакции: BAZAg

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Необходим опыт в C# для понимания этой проблемы.

Вы его каждый раз создаёте в каждом сниппете, а начальное значение у него внутри - тупо время создания.
Необходимо создавать его в общем коде, а Next обернуть в lock (так же в общем коде), что бы каждый поток мог безопасно его использовать (random не потокобезопасен).
уже давно бы ваш глобальный рандом обернули бы в лок, было бы круто
 
  • Спасибо
Реакции: BAZAg

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 371
Благодарностей
3 295
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
  • Спасибо
Реакции: BAZAg и southside

Ахилес

Client
Регистрация
11.11.2020
Сообщения
849
Благодарностей
344
Баллы
63
первая строка метода принесла бы такой же результат
нет. проверено на практике. особенно когда код вызывается в одном C# снипетте.
но я не настаиваю на применение моего метода... каждый сам должен пройти путь синяков от граблей ;-)
 

southside

Client
Регистрация
20.04.2019
Сообщения
198
Благодарностей
250
Баллы
63
Всем привет.
Не знай баг ли это, или так оно и должно работать.
В проекте ставлю
C#:
Random rnd = new Random();
int a = rnd.Next(100, 250);
return a;
И если во втором кубике поставлю
C#:
Random rnd = new Random();
int b = rnd.Next(100, 250);
return b;
В мэйкере всегда отдает разные значения, а в зенке несколько запусков разные значения

Посмотреть вложение 113033

А потом идет одно и тоже

Посмотреть вложение 113034

Как сделать чтобы разные значения были?
C#:
int num = Global.Variables.MainRandom.GetNext(1, 6);
До этого тоже такая проблема была, еле нашёл на форуме
А до этого вообще как *блан крутил день шаблон без этого кода, только потом обнаружил, что у меня "рандом" в половине потоков одинаковый был, а с этим кодом всё ок, в потоках все уникальные значения (не уверен конечно, но вроде бы это так, судя по логу)
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
C#:
int num = Global.Variables.MainRandom.GetNext(1, 6);
До этого тоже такая проблема была, еле нашёл на форуме
А до этого вообще как *блан крутил день шаблон без этого кода, только потом обнаружил, что у меня "рандом" в половине потоков одинаковый был, а с этим кодом всё ок, в 1000 потоков все уникальные значения
интересный код, не знал что еще и там вшит рандом. Методы и класс не стандартный. Есть шанс, что он как раз залочен.
@Yuriy Zymlex есть?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 371
Благодарностей
3 295
Баллы
113
интересный код, не знал что еще и там вшит рандом. Методы и класс не стандартный. Есть шанс, что он как раз залочен.
@Yuriy Zymlex есть?
Уточнил:
оно там внутри ThreadLocal, поэтому должен быть потокобезопасен
что уже накладывает свои ограничения, если захочется асинхронщины в шаблоне + так же потребуется lock.
 
  • Спасибо
Реакции: southside, BAZAg и doc

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Уточнил:

что уже накладывает свои ограничения, если захочется асинхронщины в шаблоне + так же потребуется lock.
Где-то тут давал пример реализации потокобезопасного рандома, что-то подобное в Зенно бы добавить, чтобы с коробки можно было дёргать без таскания кода между шаблонами: https://zennolab.com/discussion/threads/vstavka-randomnogo-teksta-c.75257/post-505869
 
  • Спасибо
Реакции: doc и southside

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 371
Благодарностей
3 295
Баллы
113

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