Работа рандома в 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 запусков шаблона?

Мне вот интуитивно кажется, что нет. Но я не уверена.
 
Пересоздала тему в разделе "Сниппеты". Мне кажется, тот раздел больше подходит. Закройте её здесь, если 2 одинаковые темы нельзя создавать.
 
Гуглите псевдорандом. На хабре статья была.

Код:
Развернуть Свернуть Копировать
for (int j = 0; j < 10; j++)
{
    Random rnd = new Random();
    project.SendInfoToLog(rnd.Next(50).ToString(),true);
}

Вот это попробуйте выполнить. Получите 10 одинаковых значений. Ваш код в многопотоке по идее даст одинаковые пары значений.

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

Код:
Развернуть Свернуть Копировать
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 :) Ну да, я знаю.
 
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Код:
Развернуть Свернуть Копировать
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Код:
Развернуть Свернуть Копировать
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
 
  • Оценить
Реакции: Dorian_Gray и justhelen
Все правильно думаете, но лучше пользоваться не целыми числами, у стандартного рандома очень много нерандомного)
вот вначале лучше его как-то инициализировать:
Код:
Развернуть Свернуть Копировать
var rnd = new Random(DateTime.Now.Millisecond);
Затем использовать так:
Код:
Развернуть Свернуть Копировать
if (rnd.NextDouble() < 0.2)
{
// с вероятностью 1/5
}
Рандом изначально итак привязан ко времени. Так что лучше использовать либо статический рандом, либо ту реализацию, которую я описал выше через локальное хранилище потока с генерацией экземпляра по Guid
 
  • Оценить
Реакции: justhelen

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