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

Мне вот интуитивно кажется, что нет. Но я не уверена.
 
Привет, у меня вопрос по работе рандома. Например, у меня в C# есть код, который я хочу выполнять 1 раз на 5 запусков шаблона. Для этого я пишу в кубике такое:

Код:
Развернуть Свернуть Копировать
Random rnd = new Random();
int i = rnd.Next(5);
if (i == 0){
   //код, который нужно выполнить
}
в этом случае у вас код будет выполнятся если i=0, но строчка int i = rnd.Next(5); может присвоить переменной i значение ноль несколько раз подряд или вообще не присвоить, и тогда что-бы код выполнился потребуется х.з сколько попыток.
Второй вариант вам тоже не поможет) вы лучше напишите что вам нужно конкретнее.
 
в этом случае у вас код будет выполнятся если 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го действия получается.
 
Последнее редактирование:
Вот давно хочу начать изучать теорвер (не учила нормально раньше), но всё никак :-) В общем, оказалось, что не совсем правильно вопрос сформулирован. Прикол в том, что конечно одна 1/5 вероятность не равна 10 вероятностям 1/50. Но вот если говорить например о 100 экспериментах (100 запусках шаблона с 1м и 2м вариантами кода), то одинаково получится. Ну так говорят на стековерфлоу.
 
Последнее редактирование:
Вот честно вообще не понятен вопрос, если нужен рандом чтобы раз взять цифру то зачем цикл, и как они могут одинаковые так как в первом случае поток сразу выходит а во втором в цикле крутится и не вариант что из 10 -ти раз совпадение будет, по конкретней что именно надо
 
Вот честно вообще не понятен вопрос, если нужен рандом чтобы раз взять цифру то зачем цикл, и как они могут одинаковые так как в первом случае поток сразу выходит а во втором в цикле крутится и не вариант что из 10 -ти раз совпадение будет, по конкретней что именно надо

Это был пример. Я выше написала более конкретно - одно действие2 на 5 штук действие1. На самом деле там большой шаблон, цикл на весь шаблон во втором случае. Ну долго объяснять. Пример, который я привела, полностью отражает логику того, что надо сделать. Я же не буду описывать шаблон на десятки кубиков. Поток сразу выходит в первом случае, но потоков много, т.е. в итоге первый вариант кода запускается много раз и второй вариант тоже. И вот поэтому получается одинаково, потому что речь не об одном запуске обоих вариантов. Лучше почитай по тому линку, что я дала. Там просто лучше объяснили, чем я. А вообще я уже разобралась, спасибо.
 
и что что потоков много, если не глобальная переменая там то каждый поток будет делать лишнюю работу а имено ненужный цикл, ты наверное думаешь что запустила в 100 потоков и все они ринулись в этот цикл, каждый новый поток как чистый лист
 
Конечно я так не думаю. Блин, я лучше нарисую.

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

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

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

Вложения

  • Безымянный.png
    Безымянный.png
    24,1 KB · Просмотры: 28
Всегда можно запустить, например, 10000 итераций и посмотреть результат и сравнить) Результат конечно не будет точным, но погрешностями можно пренебречь
 
  • Оценить
Реакции: justhelen
Всегда можно запустить, например, 10000 итераций и посмотреть результат и сравнить) Результат конечно не будет точным, но погрешностями можно пренебречь
Вот да, надо было. Я просто не так проверяла. У меня просто паранойя какая-то началась :D Ну т.е. я просто запустила шаблон, там в результате должно быть где-то 6 сообщений в день на стене. Раньше получалось 6 (это типа первый вариант кода). Сейчас тоже 6. И вроде как постится примерно через такие же промежутки времени, но я смотрю, что уже аж целых 5 минут прошло (когда должны пройти часы), а сообщения всё нет, и мне кажется, что не работает как надо. А потом сообщение есть, вроде всё норм. Не могла понять, это мне кажется, что оно норм или нет. Чего не запустила 10000 итераций - да вот не знаю, залипла на шаблоне, как-то не подумала об этом.

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

И вообще:

tsNeV.jpg
 
Последнее редактирование:
Нее все это как то не логично вообще черт знает что) Я бы на вашем месте сделал что то типа:

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

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

Ну ты же даже не знаешь, что конкретно я хочу рандомизировать и что конкретно делает шаблон. Конечно если предположить, что он делает что-то, что придумал ты, то будет нелогично, потому что он делает другое. Не поверишь, я знаю, что можно делать свитч и что можно просто делать рандом с 1 по 3. Только у меня другое совсем делается :)

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

Я бы описала проблему, если бы она всё ещё была :-) Но как я сказала выше уже 2 раза, я разобралась и у меня всё работает уже. Спасибо всем, кто хотел помочь, но проблема уже решилась, правда :-)
Извените я честное слово хотел помочь) P.S Не надо мне тыкать, я с вами водку не пил!
 
Извените я честное слово хотел помочь) P.S Не надо мне тыкать, я с вами водку не пил!
За попытку помочь спасибо :) Что касается водки - лол. Мы вроде как не на званом ужине, но персонально к Вам буду обращаться только на Вы, извините, если обидела. Ко мне можно на ты обращаться, я не графиня, к сожалению :)
 
Чтобы не было сюрпризов с рандомом в многопотоке http://zennolab.com/discussion/threads/random-c.25186/#post-175009

Спасибо! Тоже замечала такое, что делаются одинаковые действия, когда потоков много и используется рандом. Т.е. например если один поток делает пост, то и другие тоже. Думала, что мне кажется и это совпадение просто.

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

А, нет. Я предложила как раз то, из-за чего рандом получается одинаковым :D Внимательней прочитала статью.
 
Последнее редактирование:
Просто используйте локальное хранилище потока ThreadLocal:
Код:
Развернуть Свернуть Копировать
ThreadLocal<Random> rnd = new ThreadLocal<Random>(() => new Random(Guid.NewGuid().GetHashCode()));
Множество информации из хабра может быть устаревшим, так что не всегда на нее стоит полагаться.
P.S. есть ещё устаревшая реализация через static Random
 
Просто используйте локальное хранилище потока ThreadLocal:
Код:
Развернуть Свернуть Копировать
ThreadLocal<Random> rnd = new ThreadLocal<Random>(() => new Random(Guid.NewGuid().GetHashCode()));
Производительность замеряй.
 

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