2017-02-21 9 views
-3

私は多くのチュートリアルを見てきましたが、それは私にとってはうまくいかないようです。繰り返さずに乱数を生成する必要があります。繰り返しを使わずに乱数を生成する

これは私のコードです:

Dim intNumber As Integer 
    Dim arrNumber(0 To 0) As Integer 
    Dim i, x, y As Integer 
    'Make sure the Label is clear 
    Label1.Text = "" 



    For x = 0 To 0 
Start: 
     intNumber = Int((25 * Rnd()) + 1) ' Random number 1 to 25 
     For y = 0 To 0 
      ' Check arrNumber (y) 
      'If intnumber has already been selected, 
      'Then go and select another one. 
      If intNumber = arrNumber(y) Then 
       GoTo Start 
      End If 
     Next y 

     'Place the next non-repeated number in the arrNumber(x). 

     arrNumber(x) = intNumber 


    Next x 

    '---------------------------------------------------- 
    For i = 0 To 0 

     Label1.Text = Label1.Text & (arrNumber(i)) 
     broj1.random.Text = Label1.Text 
    Next 

End Sub 
+0

コードを見てなければ、私はあなたが乱数を初期化していることだけを推測することができますジェネレータを複数回使用すると、同じ番号が生成されます。 –

+0

申し訳ありません投稿を編集しました。前に使用したコードを挿入します。 – AceDuk

+0

あなたの質問を明確にしてください。 1から25の数字をランダムな順番で探していますか?ランダム化には数が繰り返されることがあります。 "誕生日のパラドックス"を見てください。 –

答えて

1

あなたの問題は、特にVBで、解決することは困難です。ランダムロールではなく、ランダムを探しています。つまり、25スロットのルーレットホイールを回転させるディーラーではなく、25枚のカードのシャッフルデッキからカードを1枚ずつ取り出して、カジノディーラーのエミュレーションを探しています。

難しいことの1つは、26番目のカードです。再シャッフル?同じ順序で取引しますか?

ここでは、トピックのまともなエッセイです。 http://www.4guysfromrolla.com/articles/070208-1.aspx

ここにいくつかのC#コードを示します。

private static List<int> _deck = null; 
    private static readonly Random NumberGenerator = new Random(); 
    public static int Deal() 
    { 
     if (_deck == null || _deck.Count == 0) 
     { 
      /* new deck */ 
      _deck = new List<int>(); 
      for (var i = 0; i <= 24; i++) _deck.Add(i); 
     } 

     /* get a random card from the remaining deck */ 
     var next = NumberGenerator.Next(0, _deck.Count); 
     /* retrieve the card's number */ 
     var q = _deck[next]; 
     /* and remove the card from the deck */ 
     _deck.RemoveAt(next); 
     /* return in range 1-25 */ 
     return q + 1; 
    } 
+0

ありがとう... – AceDuk

1

時々、あなたは時々あなただけの時間を知っている必要があり、時計を構築する方法を学ぶ必要があります。

Const HowMany As Integer = 25  ' how many numbers do you want? 

    Dim Used As New List(Of Integer) 
    Used.Add(0)      ' position zero has 0, all other positions have a generated counting number 

    For i = 1 To HowMany 
     Dim OK As Boolean = False  ' OK becomes true when a unique number has been generated 
     Do 
      Dim num As Integer = Int((HowMany * Rnd()) + 1) 
      If Used.Contains(num) Then 
       OK = False   ' we'll try again shortly 
      Else 
       OK = True   ' this round is complete -- found a unique number 
       Used.Add(num)  ' add the generated number to the list 
      End If 
     Loop Until OK  ' in other words, loop until we've found a unique number 
    Next 

    For i = 1 To HowMany 
     MsgBox(Used(i)) ' or just use the list in however you need 
    Next 
+0

提案:この例のような固定シリーズがある場合、ブールとしてDim Used(25)を使用し、インデックス値をテスト/設定する方が効率的です。彼は事実の後でそれらをダンプしたいので、このケースではそれは無効にされますが。 –

+1

絶対に。値の数が少ない場合、効率はそれほど重要ではありません。簡単なデモでは、ブール値の配列と結果のリスト/配列の代わりに、1つのリストを使用しました。しかし、望ましい値の数が大きくなると、 'Used(986)= True'のテストは、' Used.Contains'コードがこの特定の値に対して何百もの要素をチェックするよりもはるかに速くなります。 – ConfusionTowers

+0

作業の場合は、コードを使用してラベルを追加できますか?ラベルの配列? – AceDuk

関連する問題