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

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

Sanekk

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

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

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
в этом случае у вас код будет выполнятся если i=0, но строчка int i = rnd.Next(5); может присвоить переменной i значение ноль несколько раз подряд или вообще не присвоить, и тогда что-бы код выполнился потребуется х.з сколько попыток.
Второй вариант вам тоже не поможет) вы лучше напишите что вам нужно конкретнее.
Так мне не нужно чтобы 100% код выполнился 1 раз из 5. Я про вероятность. Если конкретно, то мне нужно, чтобы примерно после каждого 5го действия на одном сайте выполнялось другое действие. Но не точно после каждого 5го, а как раз рандомно вот так. Если 2 раза подряд выполнится 2е действие, меня это устраивает.

Вообще, мне ответили на стековефлоу :-) Если интересно: http://stackoverflow.com/questions/42173642/functioning-of-random-c-sharp

Тесты пока показывают, что одинаковое количество выполнения 2го действия получается.
 
Последнее редактирование:

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Вот давно хочу начать изучать теорвер (не учила нормально раньше), но всё никак :-) В общем, оказалось, что не совсем правильно вопрос сформулирован. Прикол в том, что конечно одна 1/5 вероятность не равна 10 вероятностям 1/50. Но вот если говорить например о 100 экспериментах (100 запусках шаблона с 1м и 2м вариантами кода), то одинаково получится. Ну так говорят на стековерфлоу.
 
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Вот честно вообще не понятен вопрос, если нужен рандом чтобы раз взять цифру то зачем цикл, и как они могут одинаковые так как в первом случае поток сразу выходит а во втором в цикле крутится и не вариант что из 10 -ти раз совпадение будет, по конкретней что именно надо
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Вот честно вообще не понятен вопрос, если нужен рандом чтобы раз взять цифру то зачем цикл, и как они могут одинаковые так как в первом случае поток сразу выходит а во втором в цикле крутится и не вариант что из 10 -ти раз совпадение будет, по конкретней что именно надо
Это был пример. Я выше написала более конкретно - одно действие2 на 5 штук действие1. На самом деле там большой шаблон, цикл на весь шаблон во втором случае. Ну долго объяснять. Пример, который я привела, полностью отражает логику того, что надо сделать. Я же не буду описывать шаблон на десятки кубиков. Поток сразу выходит в первом случае, но потоков много, т.е. в итоге первый вариант кода запускается много раз и второй вариант тоже. И вот поэтому получается одинаково, потому что речь не об одном запуске обоих вариантов. Лучше почитай по тому линку, что я дала. Там просто лучше объяснили, чем я. А вообще я уже разобралась, спасибо.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
и что что потоков много, если не глобальная переменая там то каждый поток будет делать лишнюю работу а имено ненужный цикл, ты наверное думаешь что запустила в 100 потоков и все они ринулись в этот цикл, каждый новый поток как чистый лист
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Конечно я так не думаю. Блин, я лучше нарисую.

Вот в этих 2х случаях после выполнения шаблонов примерно одинаковое количество раз ты увидишь, что i было равно 0.

Всё это схематично. Сам шаблон конечно не такой.

И, это, у меня работает всё. Спасибо, я разобралась :-) Работает так, как я объяснила (может плохо объяснила, не знаю).
 

Вложения

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Всегда можно запустить, например, 10000 итераций и посмотреть результат и сравнить) Результат конечно не будет точным, но погрешностями можно пренебречь
 
  • Спасибо
Реакции: justhelen

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Всегда можно запустить, например, 10000 итераций и посмотреть результат и сравнить) Результат конечно не будет точным, но погрешностями можно пренебречь
Вот да, надо было. Я просто не так проверяла. У меня просто паранойя какая-то началась :D Ну т.е. я просто запустила шаблон, там в результате должно быть где-то 6 сообщений в день на стене. Раньше получалось 6 (это типа первый вариант кода). Сейчас тоже 6. И вроде как постится примерно через такие же промежутки времени, но я смотрю, что уже аж целых 5 минут прошло (когда должны пройти часы), а сообщения всё нет, и мне кажется, что не работает как надо. А потом сообщение есть, вроде всё норм. Не могла понять, это мне кажется, что оно норм или нет. Чего не запустила 10000 итераций - да вот не знаю, залипла на шаблоне, как-то не подумала об этом.

Ну чего, зато я узнала, что у меня биномиальное распределение в шаблоне :D

И вообще:

 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 777
Благодарностей
1 447
Баллы
113
Нее все это как то не логично вообще черт знает что) Я бы на вашем месте сделал что то типа:

Пример с головы:
имеем сайт ну пусть будет одноклассники
имеем написаного бота который лайкает и добавляет в друзья
нам надо рандомизировать так называемую паузу, чтоб бот не стоял на паузе после определенного количества лайков, или добавлений в друзья, а что то делал безобидное, например перешел в раздел музыки, запустил песню стал малую рандомную паузу, постоял, вышел с паузы, перешел в анкету пользователя, добавил в друзья. Дальше перешел в раздел с играми проскролил типа человек решил отдохнуть и ищет игру (это снова же в место паузы) После того как поскролил пошел снова ставить лайки...
Так вот почему бы нам не создать рандом от 1 до 3 мы получим в реале от 1 до 2. Дальше логика такая: если выпало число 1 мы идем играть в игры, если 2 то слушаем музыку.
Я это все к тому что вы в своем шаблоне можете создать рандом а потом проверять переменную и в свиче уже выводить вашу логику по нужной вам ветке, можете вместо свича в C# создать код с нескольких If и так же выводить логику. Если вы меня правильно поняли тут нечего сложного нету. Можете это в цыкле делать, сравнивая то что в переменной рандом. А может я вас не доконца понял, для этого можно выложить кусок шаблона, или скриншотов где описать все то что вы хотите, или короткое видео. Ну на худой конец не ленитесь и опишите вашу проблему как можно подробнее, и вам помогут)
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Нее все это как то не логично вообще черт знает что) Я бы на вашем месте сделал что то типа:

Пример с головы:
имеем сайт ну пусть будет одноклассники
имеем написаного бота который лайкает и добавляет в друзья
нам надо рандомизировать так называемую паузу, чтоб бот не стоял на паузе после определенного количества лайков, или добавлений в друзья, а что то делал безобидное, например перешел в раздел музыки, запустил песню стал малую рандомную паузу, постоял, вышел с паузы, перешел в анкету пользователя, добавил в друзья. Дальше перешел в раздел с играми проскролил типа человек решил отдохнуть и ищет игру (это снова же в место паузы) После того как поскролил пошел снова ставить лайки...
Так вот почему бы нам не создать рандом от 1 до 3 мы получим в реале от 1 до 2. Дальше логика такая: если выпало число 1 мы идем играть в игры, если 2 то слушаем музыку.
Я это все к тому что вы в своем шаблоне можете создать рандом а потом проверять переменную и в свиче уже выводить вашу логику по нужной вам ветке, можете вместо свича в C# создать код с нескольких If и так же выводить логику. Если вы меня правильно поняли тут нечего сложного нету. Можете это в цыкле делать, сравнивая то что в переменной рандом. А может я вас не доконца понял, для этого можно выложить кусок шаблона, или скриншотов где описать все то что вы хотите, или короткое видео. Ну на худой конец не ленитесь и опишите вашу проблему как можно подробнее, и вам помогут)
Ну ты же даже не знаешь, что конкретно я хочу рандомизировать и что конкретно делает шаблон. Конечно если предположить, что он делает что-то, что придумал ты, то будет нелогично, потому что он делает другое. Не поверишь, я знаю, что можно делать свитч и что можно просто делать рандом с 1 по 3. Только у меня другое совсем делается :-)

Я бы описала проблему, если бы она всё ещё была :-) Но как я сказала выше уже 2 раза, я разобралась и у меня всё работает уже. Спасибо всем, кто хотел помочь, но проблема уже решилась, правда :-)
 
  • Спасибо
Реакции: samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 777
Благодарностей
1 447
Баллы
113
Ну ты же даже не знаешь, что конкретно я хочу рандомизировать и что конкретно делает шаблон. Конечно если предположить, что он делает что-то, что придумал ты, то будет нелогично, потому что он делает другое. Не поверишь, я знаю, что можно делать свитч и что можно просто делать рандом с 1 по 3. Только у меня другое совсем делается :-)

Я бы описала проблему, если бы она всё ещё была :-) Но как я сказала выше уже 2 раза, я разобралась и у меня всё работает уже. Спасибо всем, кто хотел помочь, но проблема уже решилась, правда :-)
Извените я честное слово хотел помочь) P.S Не надо мне тыкать, я с вами водку не пил!
 

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Извените я честное слово хотел помочь) P.S Не надо мне тыкать, я с вами водку не пил!
За попытку помочь спасибо :-) Что касается водки - лол. Мы вроде как не на званом ужине, но персонально к Вам буду обращаться только на Вы, извините, если обидела. Ко мне можно на ты обращаться, я не графиня, к сожалению :-)
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
  • Спасибо
Реакции: justhelen и doc

justhelen

Client
Регистрация
18.11.2009
Сообщения
267
Благодарностей
134
Баллы
43
Чтобы не было сюрпризов с рандомом в многопотоке http://zennolab.com/discussion/threads/random-c.25186/#post-175009
Спасибо! Тоже замечала такое, что делаются одинаковые действия, когда потоков много и используется рандом. Т.е. например если один поток делает пост, то и другие тоже. Думала, что мне кажется и это совпадение просто.

Просмотрела статью на Хабре. Как я поняла, проблему можно решить ещё с помощью создания рандомов с разным seed (а чтобы он был разным, можно например чтобы он был равен текущему времени, всё равно миллисекунды будут отличаться, чем дальше от начала шаблона, тем больше). т.е. Random rnd = new Random(DateTime.Now.Millisecond) по идее тоже решит проблему. Или нет?

А, нет. Я предложила как раз то, из-за чего рандом получается одинаковым :D Внимательней прочитала статью.
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Просто используйте локальное хранилище потока ThreadLocal:
Код:
ThreadLocal<Random> rnd = new ThreadLocal<Random>(() => new Random(Guid.NewGuid().GetHashCode()));
Множество информации из хабра может быть устаревшим, так что не всегда на нее стоит полагаться.
P.S. есть ещё устаревшая реализация через static Random
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63

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