2017-02-11 9 views
0

У меня есть вопрос о работе Random в C#. Скажем, я хочу вызвать некоторую функцию, если переменная I == 0. У меня есть следующий код:Функционирование Random, C#

Random rnd = new Random(); 
int i = rnd.Next(5); 
if (i == 0){ 
    myFunction(); 
} 

Так что, я бы назвал MYFUNCTION() один раз в 5 запусков программы. И что, если бы у меня был еще один код:

Random rnd = new Random(); 
for (int j = 0; j < 10; j++){ 
    int i = rnd.Next(50); 
    if (i == 0){ 
     myFunction(); 
    } 
} 

Был ли у меня такой же результат в финале? (вызов myFunction() один раз за 5 запусков программы)

+1

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что это не вопрос программирования, это математический вопрос. –

+0

Да, 'myFunction()' будет _on average_ вызываться также один раз каждые 5 запусков. – Serge

+0

Если вы хотите, чтобы код запускался * точно * один раз каждые пять запусков программы, вам нужно сделать что-то вроде хранения счета в реестре. –

ответ

3

Если вы даете ему попробовать, работает этот несколько раз:

class Program 
{ 
    static int _caseOneCount = 0; 
    static int _caseTwoCount = 0; 

    static Random _rnd = new Random(); 

    static void Main(string[] args) 
    { 
     var max = 100000; 

     for (var i = 0 ; i < max ; i++) 
     { 
      CaseOne(); 
      CaseTwo(); 

      Console.WriteLine(_caseOneCount.ToString() + "/" + _caseTwoCount.ToString()); 
     } 
    } 

    static void CaseOne() 
    { 
     if (_rnd.Next(5) == 0) 
      _caseOneCount++; 
    } 

    static void CaseTwo() 
    { 
     for (var i = 0 ; i < 10 ; i++) 
      if (_rnd.Next(50) == 0) 
       _caseTwoCount++; 
    } 
} 

Вы увидите, что результаты почти эквивалентны и близко к 20%, как и ожидалось.

Edit: Теперь, если вы запустите CaseOne и CaseTwo только один раз, вы можете иметь:

  • CaseOne: только 0 или 1,
  • CaseTwo: значение от 0 до 10

Редактировать 2: после комментариев @ Jean-ClaudeColette. Второй случай соответствует биномиальному распределению (https://en.wikipedia.org/wiki/Binomial_distribution).

Так как результаты, вероятность того, чтобы иметь:

  • 0 вызов 81,7%
  • 1 вызов 16.7%
  • 2 звонки составляет 1,5%
  • более
  • составляет 100% минус выше что составляет около 0,086%

Но среднее значение остается 20%.

Это означает, что применение второго случая только один раз приведет к другому результату по сравнению с первым случаем.

Random и его детали находятся в документации: https://msdn.microsoft.com/fr-fr/library/system.random(v=vs.110).aspx

И описание внутреннего алгоритма (Кнут субтрактивная генератор случайных чисел) описывается здесь (с реализацией C#, который не является.Чистая реализация, но способ увидеть, как она работает): https://rosettacode.org/wiki/Subtractive_generator

+0

Ваш образец кода на самом деле не является честным сопоставлением между P (rand (5) == 0) и P (rand (50) == 0). Вместо этого он сравнивает P (rand (5) == 0) и P (rand (50) == 0) * 10, и поэтому они оба составляют 20%. – sidecus

+0

@Helen Распределения являются биномиальными, но параметры разные. Вы ищете вероятность получения k вызовов MyFunction в n испытаниях. Вероятность вызова MyFunction равна p, вероятность получения k вызовов MyFunction - C_n^k * p^k * (1-p)^{n-k}. Мы должны сравнить результаты для k фиксированных, полученных для p = 1/5 и p = 1/50 и разных порядков n и 10 * n –

+0

@BobbyAndJoe, я интерпретировал вопрос как сравнение P (rand (5) = = 0) и P (rand (50) == 0) * 10 – lemon

0

На самом деле оба вышеуказанных утверждения были неправильными.

Для вашего первого цикла нет гарантии, что ваша функция будет вызвана один раз за 5 запусков, но если вы запустите ее достаточно, вероятность того, что ваша функция будет вызвана, равна 1/5.

Для вашего второго образца кода вероятность равна 1/50. И ваш внешний (j) цикл просто контролирует, сколько «запусков» вы собираетесь запускать с помощью ваших слов - это не изменяет вероятности.

+0

Я знаю, что нет гарантии, я говорил о вероятности. Значит, одна 1/5 вероятность равна десяти 1/50 вероятностям? :) – Helen

+1

Вы инвестируете 10 долларов США и получаете 1 доллар США назад, а ваша прибыль составляет 10%. Теперь вы инвестируете пять 10 долларов США, вы получаете прибыль на 50%? – sidecus