アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなプログラムを作成しましたが、表示が思うようにいきません。。
本当なら複数の問題をランダムで5問ずつ表示したいのですが、すべて表示することができず、1問のみだったり、3問のみしか表示されなかったりとバラバラです。
記述方法が悪いのでしょうか?どなたか分かる方いらっしゃいましたらご教授お願いします。
-------------------------
<%
accessdb="cityquiz"
cn="DRIVER={Microsoft Access Driver (*.mdb)};"
cn=cn & "DBQ=" & server.mappath(accessdb)
set rs = Server.CreateObject("ADODB.Recordset")
sql = "select * from quiz"
rs.Open sql, cn, 1, 3

total_records=rs.recordcount

randomize
random_number=int(rnd*total_records)+1

rs.MoveFirst

do while not rs.eof and counter <> random_number

counter = counter + 1

if counter= random_number then
response.write rs("問題") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if

counter2 = counter + 2

if counter2= random_number then
response.write rs("問題") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if

counter3 = counter + 3

if counter3= random_number then
response.write rs("問題") & "(3)<br>" & counter3
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if
~略~
rs.movenext
loop
%>

A 回答 (1件)

これだと、連続した問題しか表示されないし、random_numberによっては5問表示されないです。



counter?の値を追ってみましょう
1回目のループでは
counter=0+1=1
counter2=counter+2=3
counter3=counter+3=4
counter4=counter+4=5
counter5=counter+5=6
になります。
2回目のループでは
counter=1+1=2
counter2=counter+2=4
counter3=counter+3=5
counter4=counter+4=6
counter5=counter+5=7
になります。以下同様に増えていきます。

ここで、random_number=6だったとすると
1回目→counter5=6で 第1レコードの問題を表示(radio name="Q5")
2回目→counter4=6で 第2レコードの問題を表示(radio name="Q4")
3回目→counter3=6で 第3レコードの問題を表示(radio name="Q3")
4回目→counter2=6で 第4レコードの問題を表示(radio name="Q2")
5回目→該当無し
6回目→counter=6で 第6レコードの問題を表示(radio name="Q1")
→counter=random_numberでループ終了
となり、5問表示されます。
ただし、必ず連続した問題が表示されます。また、ラジオボタンはQ5からの逆順です。

では、random_number=2だったらどうでしょうか?
1回目→該当無し
2回目→counter=2で 第2レコードの問題を表示(radio name="Q1")
→counter=random_numberでループ終了
と1問しか表示されません。


現在の構造をそのまま使いたいなら、
random_number=int(rnd*(total_records-5))+1+5
として、random_numberを6~total_recordsの範囲になるようにします。

よりランダムにする常套手段として
・1~total_recordsの乱数を5つ、同じ値にならないように用意する。
・それぞれの乱数に該当するレコードを表示
とします。

あと、変数counterに初期値が無いまま、いきなりcounter=coutnter+1と使用しています。
一応、暗黙の初期値として0が入るので、今回は動作していますが、思わぬバグを引き起す原因となります。
whileループの前に count=0 と明示的に初期値を入れるような癖を身に付けましょう。
    • good
    • 0
この回答へのお礼

分かりやすく丁寧な解説ありがとうございました。
おかげさまで解決することが出来ました。
初期値を入れることも大事なんですね。バグを引き起こす原因になるのも初めて知りました。
これからはつけるように心がけていきたいと思います。
どうもありがとうございました。

お礼日時:2010/03/03 09:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!