2017-02-11 5 views
0

Ich habe eine Frage über die Arbeit von Random in C#. Sagen wir, ich möchte eine Funktion aufzurufen, wenn die Variable i == 0 ich den folgenden Code haben:Funktionsweise von Random, C#

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

Also, ich würde myFunction() einmal pro 5-Starts des Programms aufrufen. Und was wäre, wenn ich einen anderen Code hätte:

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

Würde ich das gleiche Ergebnis im Finale haben? (Aufruf von myFunction() einmal pro 5 Starts des Programms)

+1

Ich stimme diese Frage als Off-Thema zu schließen, weil dies nicht wirklich eine Programmierfrage ist, ist es eine mathematische Frage. –

+0

Ja, 'myFunction()' würde _on durchschnittlich_ auch einmal alle 5 Starts aufgerufen werden. – Serge

+0

Wenn Sie möchten, dass der Code * genau einmal * einmal alle fünf Programme startet, müssen Sie etwas wie das Speichern der Zählung in der Registrierung tun. –

Antwort

3

Wenn Sie es versuchen, laufen diese mehrere Zeiten:

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++; 
    } 
} 

Sie werden sehen, dass die Ergebnisse fast gleich sind und in der Nähe von 20%, wie erwartet.

Edit: Nun, wenn Sie laufen CaseOne und CaseTwo nur einmal, können Sie haben:

  • CaseOne: nur 0 oder 1,
  • CaseTwo: Wert von 0 bis 10

Edit 2: Befolgen Sie die Kommentare von @ Jean-ClaudeColette. Der zweite Fall entspricht einer Binomialverteilung (https://en.wikipedia.org/wiki/Binomial_distribution).

So wie Ergebnisse, ist die Wahrscheinlichkeit zu haben:

  • 0 Anruf ist 81,7%
  • 1 Aufruf 16,7%
  • 2 Anrufe beträgt 1,5%
  • mehr beträgt 100% abzüglich der oben Das ist um 0,086%

Aber der Durchschnittswert bleibt 20%.

Das bedeutet in der Tat, dass die Anwendung des zweiten Falles nur einmal zu einem anderen Ergebnis führt als im ersten Fall.

Zufall und seine Details sind in der Dokumentation: https://msdn.microsoft.com/fr-fr/library/system.random(v=vs.110).aspx

und die Beschreibung des inneren Algorithmus (Knuth subtraktiven Zufallsgenerator) wird hier beschrieben (mit einer C# -Implementierung, die nicht das ist.Net-Implementierung, aber eine Möglichkeit zu sehen, wie es funktioniert): https://rosettacode.org/wiki/Subtractive_generator

+0

Ihr Codebeispiel ist nicht wirklich ein fairer Vergleich zwischen P (rand (5) == 0) und P (rand (50) == 0). Stattdessen vergleicht es P (rand (5) == 0) und P (rand (50) == 0) * 10, und deshalb sind sie beide 20%. – sidecus

+0

@Helen Die Verteilungen sind Binomial, aber die Parameter sind unterschiedlich. Sie suchen nach der Wahrscheinlichkeit, in n Versuchen k-Aufrufe von MyFunction zu erhalten. Die Wahrscheinlichkeit, dass MyFunction gleich p ist, ist die Wahrscheinlichkeit, dass k Aufrufe von MyFunction erhalten werden: C_n^k * p^k * (1-p)^{n-k}. Wir müssen die Ergebnisse für k fix vergleichen, erhalten für p = 1/5 und p = 1/50 und verschiedene Anzahlen von Versuchen n und 10 * n –

+0

@BobbyAndJoe, interpretierte ich die Frage als Vergleich von P (rand (5) = = 0) und P (rand (50) == 0) * 10 – lemon

0

Eigentlich waren beide Ihre obigen Aussagen falsch.

Für Ihre erste Schleife gibt es keine Garantie, dass Ihre Funktion einmal pro 5 Starts aufgerufen wird - aber wenn Sie es mehrmals ausführen, ist die Wahrscheinlichkeit, dass Ihre Funktion aufgerufen wird, 1/5.

Für Ihr zweites Codebeispiel ist die Wahrscheinlichkeit stattdessen 1/50. Und Ihre äußere (j) Schleife steuert nur, wie viele "Starts" Sie mit Ihren Worten ausführen werden - es ändert nicht die Wahrscheinlichkeit.

+0

Ich weiß, dass es keine Garantie gibt, ich habe über die Wahrscheinlichkeit gesprochen. Ist also eine 1/5-Wahrscheinlichkeit gleich 10 1/50 Wahrscheinlichkeiten? :) – Helen

+1

Sie investieren $ 10 und erhalten $ 1 zurück, Ihre Gewinnrate beträgt 10%. Jetzt investierst du fünf $ 10, gewinnst du 50%? – sidecus

Verwandte Themen