2016-06-23 6 views
0

先週、私はVBAでテストを受けなければなりませんでした。私はちょっとした "ゲーム"をコーディングしなければなりませんでした。 - >Int (100 * Rnd + 1)VBA Integer vs Longは、乱数が1から100の範囲で選択された数に等しいかどうかをチェックしようとします。

  1. コール機能が
  2. は1〜100(1及び付属100)との間の乱数を生成するランダム化
  3. (付属1、100)1と100の間の数を選び:これらはルールました
  4. ランダム番号=選択した番号を確認します。
  5. 5.1 trueの場合、私はあなたがの目的を願っています。3.

のステップに戻って、カウンタに+ 1を追加し、falseの場合はゲームが
5.2終了し、印刷カウンターに対抗するために+1を追加ゲーム"。

私は整数(16ビット)としてカウンタを初期化しました。私の先生は、カウンタがオーバーフローする可能性があることを教えてくれました。オーバーフローの可能性が小さくなるようにLong(32ビット)を使用することをお勧めします。

私は、選んだ数字が生成された数字と等しい確率が1:100であるため、カウンタで32000回の試行に達することはほとんど不可能だと彼に言った。

彼は答えました:しかし、それはまだ可能です。

私の質問:
それはデータ型が整数である場合、カウンタがオーバーフローかもしれないことは可能ですか?はいの場合、チャンスは何ですか?いいえ、どうすればそれを証明できますか?

なぜこの問題は統計上ではなく、stackoverflowでですか?
これは簡単です。あなたがRnd関数とVBAを裏で知っているので、統計上の人はそうではありません。

+1

ランダム関数はあなたに同じ# 'sの背中を与えることができ、それは 'あなたが一緒に辞書を実行した場合、あなたはエントリを追加して、チェックすることができ100の袋のうちの1を取り、99を出るようではありませんIsTrueRandom(xは整数)は 'dic.Exists(x)'のようなものです。これはあなたの答えに沿って何かを与えるが、残りの数字が減少するにつれて遅くなる。あなたの先生は、#35回100回、#34 1000回、#20百万回を選ぶことができると言っています。 –

答えて

0

以上のあなたの説明から、これが無限大に

+0

そうです、前にすでにトライしている数字を試してコードフォームを止めるものはありません。しかし32000回の試行にはどのようなチャンスがありますか? –

+0

99個の数字を選んで数字を得ることはできません。あなたは毎回100分の1と99分の1を持っています。 –

+0

あなたが持っているものを使って、自分自身の 'GENERATE_RANDOM(整数としての整数)を'整数として作るが、あなたが持っているものを追跡するための公開辞書を作る。この方法では、毎回新しい番号だけを試すことができます。 –

0
を上行くことができる。すなわち、同様にオーバーフローする可能性がまだ解決しない長いので、理論的には、前に試みた数字をしようとしてからコードを止めるもの、なさそうです

これは私が過去にファイルサンプリングに使用していた質問で、十分なバイト(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 
関連する問題