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日間取り組んでいるほど愚かだと言っています