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

わんくま同盟

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

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


(過去ログ 67 を表示中)
■38565 / )  Re[5]: シャッフル
□投稿者/ ウヌ (4回)-(2009/07/19(Sun) 05:28:18)
No38376 (やじゅ さん) に返信
> 2009/07/12(Sun) 19:48:07 編集(投稿者)
>
> ■No38369 (ウヌ さん) に返信
> >>Tips7:トランプのシャッフル
> >>http://www.interq.or.jp/www-user/komurak/tips/tranp.html
>>
>>このサイトも見たんですが、それでも分からなかったのです。それに、そのまま実行すると青線ひかれます。
>
> 青線が引かれる原因の箇所である、iの型をLong→Integerに変更すればいいです。
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> Dim colBefore As Collection
> Dim colAfter As Collection
> Dim i As Integer 'Long→Integerに変更
>
> colBefore = New Collection
> colAfter = New Collection
>
> 'colBefore にセットされる値
> '1,2,3,4,5,6,7,8,9,10,11,12,13
> For i = 1 To 13
> colBefore.Add(CStr(i))
> Next
>
> 'colBefore が無くなるまで繰り返す
> Do Until colBefore.Count = 0
>   '1回目 1〜13 の中から乱数値を取得 例 i=5   
>   '2回目 1〜12 の中から乱数値を取得 例 i=9   
>   '3回目 1〜11 の中から乱数値を取得 例 i=3   
> i = Int(Rnd(1) * (colBefore.Count - 1)) + 1
>
>   '1回目 colAfterに乱数値を登録 例 i=5
>   '2回目 colAfterに乱数値を登録 例 i=9
>   '3回目 colAfterに乱数値を登録 例 i=3
> colAfter.Add(colBefore.Item(i))
>
>   '既にcolAfterに登録した乱数値を削除(同じ乱数値を出さないため)
>   '1回目 colBeforeを1つ削除(乱数値) 例 i=5
>   '2回目 colBeforeを1つ削除(乱数値) 例 i=9
>   '3回目 colBeforeを1つ削除(乱数値) 例 i=3
> colBefore.Remove(i)
> Loop
>
> 'colAfterにシャッフルされた値がセットされたので、全て表示   
> For i = 1 To 13
> Debug.Print(colAfter.Item(i))
> Next
>
> End Sub
>

じっくり読ませていただきました。そして、自分なりに、13ではなく10個の数字を数列化しました。確かに、重複なく数字が並ぶようになりました。

しかし、いつも10が最後になってしまいます。Collectionはインデックスが0からみたいなので、修正しようとしましたが、

Dim colBefore As Collection
Dim colAfter As Collection
Dim i As Integer 'Long→Integerに変更

colBefore = New Collection
colAfter = New Collection

'colBefore にセットされる値
'1,2,3,4,5,6,7,8,9,10
For i = 0 To 9
colBefore.Add(CStr(i))
Next

'colBefore が無くなるまで繰り返す
Do Until colBefore.Count = 0
'1回目 1〜10 の中から乱数値を取得 例 i=5   
'2回目 1〜9 の中から乱数値を取得 例 i=9   
'3回目 1〜8 の中から乱数値を取得 例 i=3   
i = Int(Rnd() * (colBefore.Count - 1))

'1回目 colAfterに乱数値を登録 例 i=5
'2回目 colAfterに乱数値を登録 例 i=9
'3回目 colAfterに乱数値を登録 例 i=3
colAfter.Add(colBefore.Item(i))

'既にcolAfterに登録した乱数値を削除(同じ乱数値を出さないため)
'1回目 colBeforeを1つ削除(乱数値) 例 i=5
'2回目 colBeforeを1つ削除(乱数値) 例 i=9
'3回目 colBeforeを1つ削除(乱数値) 例 i=3
colBefore.Remove(i)
Loop

'colAfterにシャッフルされた値がセットされたので、全て表示   
For i = 0 To 9
Debug.Print(colAfter.Item(i))
Next

どうしても、colAfter.Add(colBefore.Item(i))の行でエラーが起こります。たびたび申し訳ありませんが、回答よろしくお願いします。
返信 編集キー/


管理者用

- Child Tree -