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

justhelen

Client
Joined
Nov 18, 2009
Messages
267
Reaction score
134
Points
43
Привет, у меня вопрос по работе рандома. Например, у меня в C# есть код, который я хочу выполнять 1 раз на 5 запусков шаблона. Для этого я пишу в кубике такое:

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

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

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

justhelen

Client
Joined
Nov 18, 2009
Messages
267
Reaction score
134
Points
43
Пересоздала тему в разделе "Сниппеты". Мне кажется, тот раздел больше подходит. Закройте её здесь, если 2 одинаковые темы нельзя создавать.
 

stanar

Client
Joined
Dec 19, 2015
Messages
315
Reaction score
157
Points
43
Гуглите псевдорандом. На хабре статья была.

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

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

ZennoScript

Moderator
Joined
Mar 4, 2011
Messages
4,452
Reaction score
1,888
Points
113
Это рандом. Он может Вам, как 5 раз подряд выдать 5, так и ни разу не выдать 5 за 20 попыток. Тут как выпадет.
Если нужно именно 1 из 5 делать, то нужно другой подход использовать. Если же это не так принципиально и достаточно какой то погрешности, то вполне подойдёт Ваш вариант.
 

justhelen

Client
Joined
Nov 18, 2009
Messages
267
Reaction score
134
Points
43
Гуглите псевдорандом. На хабре статья была.

Code:
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

Активный пользователь
Joined
Nov 25, 2014
Messages
335
Reaction score
143
Points
43
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Code:
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Code:
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
 

amyboose

Client
Joined
Apr 21, 2016
Messages
2,311
Reaction score
1,191
Points
113
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Code:
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Code:
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
Рандом изначально итак привязан ко времени. Так что лучше использовать либо статический рандом, либо ту реализацию, которую я описал выше через локальное хранилище потока с генерацией экземпляра по Guid
 
  • Thank you
Reactions: justhelen

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)