質問: RandomNo End Function
回答: 私のよく使うアルゴリズムは次のようなものです。 まず、問題番号のIndexを入れたテーブルを作成します。 Const c_MaxQuizNum = 40 ' 全問題数 Const c_QuizNum = 20 ' 出題数 Dim QuizIndex(c_MaxQuizNum) As Integer ' 問題の Index 格納用 Dim QuizLastNum as Integer ' 問題の残り数 Dim TmpRndm As Integer ' 選択された値 Dim RandomNo As Integer ' 選択された問題番号 Dim i As Integer For i = 1 To c_MaxQuizNum QuizIndex(i) = i '初期値を格納 Next これを利用し、重複しない問題番号を取り出すことが可能です。 QuizLastNum = c_MaxQuizNum ' 問題の残り数初期化 For i = 1 To c_QuizNum TmpRndm = Int((QuizLastNum * Rnd) + 1) ' 1~QuizLastNum の乱数 RandomNo = QuizIndex(TmpRndm) ' 問題番号を取得 QuizIndex(TmpRndm) = QuizIndex(QuizLastNum) ' 問題の選択肢をつめる QuizLastNum = QuizLastNum - 1 ' 問題の残り数を減らす ' 以降、ユーザ処理 Next つまり、簡単な例として c_MaxQuizNum = 5 としたとき、 QuizIndex には、 1 , 2 , 3 , 4 , 5 が順に入っています。 QuizLastNum には c_MaxQuizNum = 5 が入っていますね。 ここで、出題用の For ループ処理を始めると TmpRndm は 1~5 のいずれかの整数が入ります。 よって、RandomNo には 1 , 2 , 3 , 4 , 5 のいずれかが選ばれるわけです。 そして、ここからがミソなのですが、今仮に TmpRndm に 3 が選ばれるとします。 QuizIndex(TmpRndm) = QuizIndex(QuizLastNum) の処理により、QuizIndex には、 1 , 2 , 5 , 4 , 5 が入るわけです。 そして、QuizLastNum の値を 1 減らします。 すると 2 回目の For ループは どうなるでしょうか? TmpRndm は QuizLastNum を減らしたため 1~4 のいずれかの整数が入ります。 よって、RandomNo には 1 , 2 , 5 , 4 のいずれかが選ばれ、 先ほど出題した 3 は選択されません。 重複を無くし、かつ効率の良い方法でしょう? このアルゴリズムおわかりいただけましたでしょうか?