C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 配列をシャッフル


(過去ログ 65 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■37873 / inTopicNo.1)  配列をシャッフル
  
□投稿者/ nihihi (2回)-(2009/07/02(Thu) 12:18:01)

分類:[VB.NET/VB2005 以降] 

今VB.NETでUNOゲームを作成しています。
Cardクラスを作成し、全カード(108枚)を配列に格納することができました。
配列は、 List(Of Card) なのですが、その内容をシャッフルしたいです。
Listクラスの中身をシャッフルする方法を教えてください。
よろしくお願いします。

引用返信 編集キー/
■37874 / inTopicNo.2)  Re[1]: 配列をシャッフル
□投稿者/ .SHO (914回)-(2009/07/02(Thu) 12:24:50)
乱数を使いましょう。
引用返信 編集キー/
■37876 / inTopicNo.3)  Re[2]: 配列をシャッフル
□投稿者/ nihihi (3回)-(2009/07/02(Thu) 12:55:59)
No37874 (.SHO さん) に返信
> 乱数を使いましょう。
回答ありがとうございます。
元のListと新しいListの内容を乱数を使って入れ替えることで解決しました。
解決済み
引用返信 編集キー/
■37878 / inTopicNo.4)  Re[3]: 配列をシャッフル
□投稿者/ みきぬ (504回)-(2009/07/02(Thu) 13:14:13)
2009/07/02(Thu) 13:14:35 編集(投稿者)
実用性皆無だけど、カードということで遊んでみた。

    Private rand As New Random()

    Public Sub Shuffle()

        Dim cards As New List(Of Card)
        For i As Integer = 1 To 108
            cards.Add(New Card(i))
        Next

        For i As Integer = 1 To 100
            cards = HiduShuffle(cards)
            'cards = RiffleShuffle(cards)
        Next

        For Each card As Card In cards
            Console.Write(card.Value & ", ")
        Next

    End Sub

    Private Function HiduShuffle(ByVal before As List(Of Card)) As List(Of Card)
        Dim i1 As Integer = rand.Next(1, before.Count / 2)
        Dim i2 As Integer = rand.Next(before.Count / 2, before.Count)

        Dim after As New List(Of Card)

        after.AddRange(before.GetRange(i1, i2 - i1))
        after.AddRange(before.GetRange(0, i1))
        after.AddRange(before.GetRange(i2, before.Count - i2))

        Return after
    End Function

    Private Function RiffleShuffle(ByVal before As List(Of Card)) As List(Of Card)
        Dim threshold As Integer = rand.Next(before.Count / 2 - 5, before.Count / 2 + 5)
        Dim i1 As Integer = 0
        Dim i2 As Integer = threshold

        Dim after As New List(Of Card)

        While (i1 < threshold And i2 < before.Count)
            after.Add(before(i1))
            after.Add(before(i2))
            i1 += 1
            i2 += 1
        End While

        If (i1 < threshold) Then
            after.AddRange(before.GetRange(i1, threshold - i1))
        End If
        If (i2 < before.Count) Then
            after.AddRange(before.GetRange(i2, before.Count - i2))
        End If

        Return after
    End Function

    Public Class Card
        Public Value As Integer

        Public Sub New(ByVal i As Integer)
            Value = i
        End Sub

    End Class

# チェック外しちゃってた(。。;

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -