を追加/削除することができます。
Module Module1
Dim deck As New List(Of Integer)
Dim prng As New Random
Sub Main()
newDeck()
showDeck()
shuffle()
showDeck()
Dim s As String
Do
s = Console.ReadLine()
Select Case s
Case "s"
showDeck()
Case "c"
If deck.Count = 0 Then
Console.WriteLine("No cards")
Else
'take top card
Dim foo As Integer = deck(0)
deck.RemoveAt(0)
Console.WriteLine(foo.ToString)
End If
Case "n"
newDeck()
shuffle()
End Select
Loop Until s.ToLower = "x"
End Sub
Sub newDeck()
deck = Enumerable.Range(1, 52).ToList 'create deck
End Sub
Sub shuffle()
deck = deck.OrderBy(Function(r) prng.Next).ToList
End Sub
Sub showDeck()
Dim ctr As Integer = 0
Console.WriteLine()
For Each card As Integer In deck
Console.Write("{0}", card.ToString.PadLeft(4, " "c))
ctr += 1
If ctr Mod 10 = 0 Then Console.WriteLine()
Next
Console.WriteLine()
End Sub
End Module
これは、コンピュータが現実の世界を正確に模倣すべきではないと私は考えていました。まず、乱数ジェネレータの種を知ることで問題を示すプログラムがあります。
'create a form with three buttons and a richtextbox
Dim deckIdx As New List(Of Integer)
Dim cards As New List(Of card)
Dim prng As New Random
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
newDeck()
shuffle()
showDeck()
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
'show next five cards
Dim sb As New System.Text.StringBuilder
sb.AppendLine()
For x As Integer = 1 To 5
Dim foo As card = getTopCard()
If Not foo Is Nothing Then sb.AppendFormat("{0}", foo.theCard.ToString.PadLeft(4, " "c))
Next
RichTextBox1.AppendText(sb.ToString)
RichTextBox1.ScrollToCaret()
End Sub
Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
Button1.PerformClick()
End Sub
Class card
Public theCard As Integer
Public count As Integer
End Class
Sub newDeck()
prng = New Random(42) '<<<<<<<<<<<<<<<<<<<<<<<< OOPS!!!
deckIdx = Enumerable.Range(0, 51).ToList 'create deck indicies
cards = New List(Of card)
For Each cIDX As Integer In deckIdx
Dim foo As New card
foo.theCard = cIDX
foo.count = 0
cards.Add(foo)
Next
End Sub
Sub shuffle()
deckIdx = deckIdx.OrderBy(Function(r) prng.Next).ToList
End Sub
Function getTopCard() As card
If deckIdx.Count > 0 Then
Dim foo As New card
foo.theCard = cards(deckIdx(0)).theCard
foo.count = cards(deckIdx(0)).count
deckIdx.RemoveAt(0)
Return foo
Else
Return Nothing
End If
End Function
Sub showDeck()
Dim ctr As Integer = 0
Dim sb As New System.Text.StringBuilder
For Each card As Integer In deckIdx
sb.AppendFormat("{0}", cards(card).theCard.ToString.PadLeft(4, " "c))
ctr += 1
If ctr Mod 10 = 0 Then sb.AppendLine()
Next
RichTextBox1.Text = sb.ToString
End Sub
プログラムを実行してbutton1/3を繰り返し押すと、同じ結果が繰り返し表示されます。コンピュータが現実の世界を正確に模倣しなければならないという考えに固執するつもりならば、明らかな修正はPRNGを再シードすることではありません。しかし、もし我々が別のアプローチをとったらどうでしょうか?
は何も変わっていないことを確認するために、押しボタン1と3、前と同じようにこのコード
Dim bkgShuffle As Threading.Thread
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Button2.Enabled = False
bkgShuffle = New Threading.Thread(AddressOf shuffleBkg)
bkgShuffle.IsBackground = True
bkgShuffle.Start()
End Sub
Sub shuffleBkg()
Do
Threading.Thread.Sleep(50)
shuffle()
Loop
End Sub
実行にプログラムを追加します。あなたが満足したら、ボタン2を押して、ボタン1と3を押します。
カードを人でプレイすると、デッキが常にシャッフルされているのではないことは明らかですが、それは何か変わるだろうか?私がオンラインでカードをプレイすると、デッキが常にシャッフルされているかどうか知っていますか?
コードは、ボックスの外で考えると、完成品と見なされるべきではありません。
編集: Bull Mountainがこれに影響する可能性があります。
ように重複する可能性が知られているがVB.NET?](http://stackoverflow.com/questionsで、リストをランダム化する簡単な方法はあります/ 554587/vb-netの一覧にある簡単な方法でランダム化する) –
@Bruno - リストの使用を検討してください。私が提供したコードを見てください。 – dbasnett