Работа рандома в c#

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Привет, у меня вопрос по работе рандома. Например, у меня в C# есть код, который я хочу выполнять 1 раз на 5 запусков шаблона. Для этого я пишу в кубике такое:

Код:
Random rnd = new Random();
int i = rnd.Next(5);
if (i == 0){
   //код, который нужно выполнить
}
А что будет, если я напишу по-другому? Вот так:

Код:
Random rnd = new Random();
for (int j = 0; j < 10; j++){
    int i = rnd.Next(50);
    if (i == 0){
       //код, который нужно выполнить
    }
}
У меня в результате получится то же 1 выполнение кода на 5 запусков шаблона?

Мне вот интуитивно кажется, что нет. Но я не уверена.
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Пересоздала тему в разделе "Сниппеты". Мне кажется, тот раздел больше подходит. Закройте её здесь, если 2 одинаковые темы нельзя создавать.
 

stanar

Client
Регистрация
19.12.2015
Сообщения
315
Благодарностей
157
Баллы
43
Гуглите псевдорандом. На хабре статья была.

Код:
for (int j = 0; j < 10; j++)
{
    Random rnd = new Random();
    project.SendInfoToLog(rnd.Next(50).ToString(),true);
}
Вот это попробуйте выполнить. Получите 10 одинаковых значений. Ваш код в многопотоке по идее даст одинаковые пары значений.

П.С. Не про то спросила) Оставлю, может кому пригодится
 
Последнее редактирование:

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113
Это рандом. Он может Вам, как 5 раз подряд выдать 5, так и ни разу не выдать 5 за 20 попыток. Тут как выпадет.
Если нужно именно 1 из 5 делать, то нужно другой подход использовать. Если же это не так принципиально и достаточно какой то погрешности, то вполне подойдёт Ваш вариант.
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Гуглите псевдорандом. На хабре статья была.

Код:
for (int j = 0; j < 10; j++)
{
    Random rnd = new Random();
    project.SendInfoToLog(rnd.Next(50).ToString(),true);
}
Вот это попробуйте выполнить. Получите 10 одинаковых значений. Ваш код в многопотоке по идее даст одинаковые пары значений.

П.С. Не про то спросила) Оставлю, может кому пригодится
Гуглила. Это если подряд без перерыва будут создаваться new Random(). А у меня между созданиями рандома на самом деле проходит время, там делаются ещё действия, которые занимают наверное около минуты каждое.

Это рандом. Он может Вам, как 5 раз подряд выдать 5, так и ни разу не выдать 5 за 20 попыток. Тут как выпадет.
Если нужно именно 1 из 5 делать, то нужно другой подход использовать. Если же это не так принципиально и достаточно какой то погрешности, то вполне подойдёт Ваш вариант.
Да я видимо неправильно как-то сказала. Мне на самом деле не нужно именно 1 из 5, а с вероятностью 1 к 5. Теперь все пишут, что не будет точно 1 на 5 :-) Ну да, я знаю.
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Код:
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Код:
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
 
  • Спасибо
Реакции: Dorian_Gray и justhelen

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Код:
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Код:
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
Рандом изначально итак привязан ко времени. Так что лучше использовать либо статический рандом, либо ту реализацию, которую я описал выше через локальное хранилище потока с генерацией экземпляра по Guid
 
  • Спасибо
Реакции: justhelen

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