2

Dr.DEKnuth の Subtractive RANDOM 数生成アルゴリズムを実装したいと考えています。ユーザーのログイン時にボタンがスクランブルされる ATM パネルを実装したいと考えています。すべてのボタンはその位置を変更します。

これが私のコードです:

Public Sub addbutton()
        Dim n As Integer = 0

        For i As Integer = 0 To 10
            ' Initialize one variable
            btnArray(i) = New System.Windows.Forms.Button
        Next i

        While (n < 10)
            With (btnArray(n))
                .Tag = n + 1 ' Tag of button
                .Width = 40 ' Width of button
                .Height = 40
                FlowLayoutPanel1.Controls.Add(btnArray(n))
                .Text = Chr(n + 48)
                AddHandler .Click, AddressOf Me.ClickButton
                n += 1
            End With
        End While
    End Sub

次に、ボタン テキストに情報を送信するために、以下を使用しました。

 Dim btn As Button = sender
        TextBox1.Text += btn.Text

btnArray()ここでの主要なタスクはwith関数をシャッフルするRandom()ことです..しかし、私はこれを行うことができませんでした. 次のように、配列をシャッフルするためのコードを取得できました。

Imports System.Security.Cryptography

Public Class ArrayUtilities
    Private Random As RNGCryptoServiceProvider = New RNGCryptoServiceProvider
    Private Bytes(4) As Byte

    Public Function ShuffleArray(ByVal argArr As Array) As Array
        Dim FirstArray As New ArrayList(argArr)
        Dim SecoundArray As Array = Array.CreateInstance(GetType(Object), FirstArray.Count)
        Dim intIndex As Integer
        For i As Integer = 0 To FirstArray.Count - 1
            intIndex = RandomNumber(FirstArray.Count)
            SecoundArray(i) = FirstArray(intIndex)
            FirstArray.RemoveAt(intIndex)
        Next
        FirstArray = Nothing
        Return SecoundArray
    End Function

    Private Function RandomNumber(ByVal argMax As Integer) As Integer
        If argMax <= 0 Then Throw New Exception
        Random.GetBytes(Bytes)
        Dim intValue As Integer = (BitConverter.ToInt32(Bytes, 0)) Mod argMax
        If intValue < 0 Then intValue = -intValue
        Return intValue
    End Function
End Class

Module Module1
    Sub Main()
        Dim AU As ArrayUtilities

        AU = New ArrayUtilities

        Dim GivenArray As Integer() = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
        Dim NewArray As Array = AU.ShuffleArray(GivenArray)
        Dim i As Integer
        Dim stb As New System.Text.StringBuilder
        stb.Append("GivenArray = {0,1,2,3,4,5,6,7,8,9}")
        stb.Append(vbCrLf)
        stb.Append("NewArray = {")
        For i = 0 To NewArray.Length - 2
            stb.Append(NewArray(i).ToString)
            stb.Append(", ")
        Next
        stb.Append(NewArray(NewArray.Length - 1).ToString)
        stb.Append("}")
        Console.Write(stb.ToString)
        Console.Read()
    End Sub
End Module

しかし、このコードをデバッグすると、配列の RANDOMNESS が得られます。同様に、フォームのボタンにもランダム性が必要です。

ありがとうございます。私はあなたが提案したコードを試しました。増分文字「n」がありませんでした。デバッグ可能なコードは、flowlayoutpannel.controls.add(out(n)) です。しかし、それは私が望んでいたように機能しておらず、上記のコードは、ボタンを 2 シャッフルする方法を示すためのものです。ボタン配列を作成し、RANDOM() でランダム化してフォームに追加する簡単な方法はありますか。私の仲間は、あなたがこのトピックに過去20〜25日間取り組んでいるほど愚かだと言っています

4

3 に答える 3

2

かなりの数の「シャッフル」アルゴリズムがあり (Fisher-Yates などを検索してください)、通常は実装が難しくありません。最も簡単な(imho)方法は、LINQを使用することです:

Dim r As New Random
Dim out = (From b In btnArray Order By r.Next Select b).ToArray

ボタンの POSITIONS をシャッフルしたいですか、それとも配列の CONTENT (ボタン) をシャッフルしたいですか?

于 2012-11-12T08:12:19.640 に答える
0

そのために暗号的に安全な乱数ジェネレーターを使用する必要はなく、別のクラスも必要ありません。

Private Shared rng As New Random()

Private Shared Function ShuffleArray(Of T)(arr() As T) As T()
    Dim left = Enumerable.Range(0, arr.Length).ToList()
    Dim result(arr.Length - 1) As T

    For i = 0 To arr.Length - 1
        Dim nextIndex = rng.Next(left.Count)
        result(i) = arr(left(nextIndex))
        left.RemoveAt(nextIndex)
    Next

    Return result
End Function
于 2012-11-13T05:06:06.337 に答える
0

パネル内でボタンの位置をランダムに設定するには、ループで 0 から 9 までの n を使用する代わりに、0 から 9 までのランダムな値を使用できます。同じ値を 2 回使用しないようにしてください。

于 2012-11-11T15:46:07.783 に答える