• ベストアンサー

VBで作った乱数を一度も重複させずに表示する方法を教えてください!

VB2005で乱数を作り、ボタンを押すごとに一つづつその数字がひょうじされるようにしたいのですが、その数字が一度も重複されないようにするにはどうしたらいいのでしょうか? 例えばボタンを百回押すと、1から100までの数字がランダムに、一度も重複されずに表示されるようにするにはどのようなコードを書けばよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>もう一度同じ作業を行った際に、 Form1_LoadにRandomize()を追加します。 Rnd関数の乱数ジェネレータに新しいシード値を指定して初期化。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer For i = 1 To 100 tbl.Add(i) Next Randomize() End Sub

mintnia
質問者

お礼

ありがとうございました。 とっても助かりました!

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

http://www.relief.jp/itnote/archives/001798.php これはエクセルのワークシートの例だが、プログラムにも大様できる でしょう。セルは配列にし、Rank関数にあたる機能のルーチンは自作。

mintnia
質問者

お礼

ページを拝見させていただきました。 エクセルで用いている方法を利用するという手もあるのですね。 ありがとうございました!

  • 04kuu11
  • ベストアンサー率16% (1/6)
回答No.3

1から100までの数字が順番に格納された配列を用意し、その配列のn番目とm番目の数字を入れ替えます(nとmは乱数で発生します)。 この入れ替え操作を十分な回数行ってから、配列を順に表示すれば所望の結果が得られると思います。

mintnia
質問者

お礼

回答ありがとうございます。 説明のみで理解できるほど私の頭がついていっていないので難しいのですが・・勉強します。ありがとうございました。

回答No.2

Private tbl As New ArrayList Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer For i = 1 To 100 tbl.Add(i) Next End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer If tbl.Count <= 0 Then Exit Sub i = Rnd() * (tbl.Count - 1) MsgBox(tbl(i)) tbl.RemoveAt(i) End Sub 101回目のことは考慮してませんが。

mintnia
質問者

補足

早速のお返事ありがとうございます。 書いていただいたコードで出来ました!ありがとうございます。 ただ、プログラムを終了して、もう一度同じ作業を行った際に、 違う順番でまた先ほどのようなランダムな数字を得る事は可能でしょうか? わかれば教えていただきたいです。よろしくお願いします!

回答No.1

同じ数字が出てはいけないというルールは乱数だけでは実現不可です。(『不規則な』数値を発生させるというのが乱数ですから。) よって、表示済みの数字を記録しておき、それとマッチしたらもう一回やり直しというトラップをおくか(ちとぶざまか?)、変数か何かで母集団を作成し、その中から乱数でひとつを選択、選択したものは母集団から削除するかのいずれかでしょう。 (いうまでもなく考え方だけです。)

mintnia
質問者

お礼

私も乱数を使って式を作ってみたのですが、ランダムにはでるものの、重複の際の処理がわかりませんでした。 回答どうもありがとうございました!