2016-06-23 18 views
0

Letzte Woche musste ich einen Test in VBA machen. Ich musste ein kleines "Spiel" programmieren. Das waren die Regeln:VBA Integer vs Long zum Zählen versucht an zu überprüfen, ob die Zufallszahl gleich der gewählten Zahl im Bereich von 1 bis 100 ist

  1. Wählen Sie eine Zahl zwischen 1 und 100 (1 und 100 enthalten)
  2. Anruffunktion Randomize
  3. Generieren einer Zufallszahl zwischen 1 und 100 (1 und 100 enthalten) ->Int (100 * Rnd + 1)
  4. Überprüfen Sie, ob die Zufallszahl = gewählte Nummer ist.
  5. 5.1 Wenn dies zutrifft, fügen +1 entgegen zu wirken, Druckzähler, Spiel
    5.2 Wenn false abgeschlossen ist, fügen Sie + 1 Zähler, gehen Sie zurück zu Schritt 3.

Ich hoffe, dass Sie das Ziel, erhalten von das Spiel".

Ich initialisierte den Zähler als Ganzzahl (16 Bit). Mein Lehrer sagte mir, dass es möglich ist, dass der Zähler überläuft. Er empfiehlt die Verwendung eines langen (32 Bit), so dass die Chance zum Überlauf kleiner ist.

Ich sagte ihm, dass es fast unmöglich ist, 32000 Versuche auf dem Zähler zu erreichen, weil die Chance, dass die gewählte Zahl gleich der generierten Nummer ist, 1: 100 ist.

Er antwortete: Aber es ist immer noch möglich.

Meine Frage:
Ist es möglich, dass der Zähler überlaufen könnte, wenn der Datentyp Integer ist? Wenn ja, wie ist die Chance? Wenn nein, wie kann ich es beweisen?

Warum ist diese Frage auf Stackoverflow und nicht auf Statistiken?
Es ist einfach. Weil Sie die Rnd-Funktion und VBA hinter den Kulissen kennen, die Jungs auf Statistiken nicht.

+1

Die Zufallsfunktion können Sie die gleichen # 's zurück geben, es ist nicht wie 1 aus einer Tasche von 100 nehmen und verlassen 99. Wenn Sie ein Wörterbuch neben lief, können Sie die Einträge hinzufügen könnte und prüfen Sie dann ' IsTrueRandom (x als ganze Zahl) 'sei' dic.Exists (x) 'so etwas. Dies gibt Ihnen etwas in Übereinstimmung mit Ihrer Antwort, aber es wird langsam, wenn die verbleibenden Zahlen sinken. Ich denke, dein Lehrer sagt, du könntest # 35 100 mal, dann # 34 1000 mal, dann # 20 eine Million mal. –

Antwort

0

Aus Ihrer Beschreibung oben scheint nichts zu sein, den Code zu stoppen aus Zahlen versuchen, es vorher schon versucht hat, so theoretisch eine lange nicht hilft, die auch überlaufen könnte, dh diese ins Unendliche gehen könnte

+0

Das ist richtig, nichts stoppt die Codeform, die Zahlen versucht, die es bereits zuvor getriegelt hat. Aber was ist die Chance 32000 Versuche zu erreichen? –

+0

Was ist die Chance, 99 Zahlen zu wählen und nie die Nummer zu bekommen? Sie haben 1/100 für und 99/100 gegen jedes Mal. –

+0

Machen Sie Ihre eigenen 'GENERATE_RANDOM (outofNumbers als ganze Zahl) als Integer 'mit dem, was Sie haben, aber ein öffentliches Wörterbuch, um die, die Sie haben, zu verfolgen. Auf diese Weise können Sie immer nur nach einer neuen Nummer suchen. –

0

So etwas habe ich in der Vergangenheit für die Dateiauswahl verwendet, die Frage ist ein Byte ausreichend (1-255)?

Public dicGeneratedAlready As Scripting.Dictionary 

Public Function GENERATE_RANDOM(intFromNumber As Integer) As Integer 

Randomize 

If dicGeneratedAlready Is Nothing Then Set dicGeneratedAlready = New Scripting.Dictionary 

GenerateRand: 

GENERATE_RANDOM = Int((Rnd * intFromNumber) + 1) 

If dicGeneratedAlready.Exists(CStr(GENERATE_RANDOM)) Then 
    GoTo GenerateRand 
Else 
    dicGeneratedAlready.Add CStr(GENERATE_RANDOM), CStr(GENERATE_RANDOM) 
End If 

End Function