2016-04-13 11 views
0

プログラムを実行するたびに、0〜3の間の乱数を複数回生成しようとしています。 私は今、次のコードを使用しています:VB6でランダム化関数

Private Sub scatterfun() 
Dim cout As Integer, temvar As Integer 
While (cout < 500) 
    Randomize 
    temvar = CInt(Int((3 * Rnd(1)) + 0)) 
    If temvr = 0 Then 
     Statements 
    ElseIf temvar = 1 Then 
     Statements 
    ElseIf temvar = 2 Then 
     Statements 
    ElseIf temvar = 3 Then 
     Statements 
    End If 
    cout = cout + 1 
Wend End Sub 

をしかし、私はそれを実行するたびに、それは私に同じ乱数生成パターンを示しています。 毎回異なる乱数のセットを生成するにはどうすればよいですか?

私はランダマイザ()を使用して取得することはできませんどのように

+0

http://www.fortypoundhead.com/showcontent.asp?artid=23621 – Marc

+0

ありがとう、これは私が探していたものです –

答えて

2

あなたのコードを簡素化(および修正;あなたは0から2に与える)することができますこれに:

Dim i As Integer 
For i = 0 To 500 
    Select Case Int(4 * Rnd()) 
     Case 0 
      Debug.Print "0"; 
     Case 1 
      Debug.Print "1"; 
     Case 2 
      Debug.Print "2"; 
     Case 3 
      Debug.Print "3"; 
    End Select 
Next 

それを試してみて、見。 Randomizeステートメントはシードをシステムタイマーに設定するだけで、Rnd(1)Rnd()に相当します。また、here's Rnd関数のドキュメント。

0

あなたは、私が問題を再現することはできません

Randomize Timer 

代わりの

Randomize 
0

を使用することができます。あなたのコード(StatementsDebug.Printに置き換え、@BobRodesバグ修正を使用して0-3の範囲の値を返す)は、Excel VBA(VB6と同じコア言語)で期待どおりに動作し、異なる実行時に異なるストリームのストリームを生成します。私が発掘したRandomizeに関するすべてのドキュメントは、引数なしで呼び出されたときにシステムタイマーを使用して乱数生成をシードすることを明示しています。

しかし、あなたの質問と@Marcのコメントにリンクされたブログ記事には、VB6がRandomizeを処理する方法に影響するバグがあることが示唆されています。これはおそらく他のバージョンのWindows(および/以前のバージョンのVisual Studioを使用している場合はVB6コンパイラ) VB6ランタイムを含むDLLが、システムタイマーの間違った場所にあり、エラーをトリガし、エラー処理でRandomizeに渡されたシード値に0が使用されていることが考えられます。

@Grcnに記載されているように、Randomize Timerは回避策です。しかし、もしあなたがそれを使用しているなら、Timerはミリ秒の解像度を持っているように思えますし、ループでそれを使用すると、Timerはまったく同じ値を返す可能性があります。極端なケースでは、ループ本体が1秒間に100万回実行できるようなものであり、例のように500回実行されるループを使用する場合、Timerはすべて同じ値を返す可能性があります回。間もなく気付くでしょうが、ループを実行するのに要する時間が1ミリ秒の分解能をわずかに下回る場合、同じ「ランダム」値を持つループを通過するパス数は予想を上回りますがカジュアルな通知を逃れる方法で。このため、Randomize Timerというコールは、ループ内からその直前に移動する必要があります。

関連する問題