今から具体例を挙げますが、それがより楽に・無駄なく実装出来るならば、
ジャグ配列にこだわる必要は全く無いことを先に述べておきます。
・0〜N-1の整数から1つ選ぶというくじ引きに、P人が参加した。
・参加者は何を選択するか決める。
・当選番号はMであると発表する。
・Mを選んだ人がいない場合は何もしない。
・Mを選んだ人の中から抽選で一人に絞り込む。
ということを実装したいと考えています。
なお、スクリプト中ではN=100、P=10000としており、
また参加者が選ぶ数字はランダムに決定するようにしています。
さて、この処理では、例えば抽選の結果9999さんが当選することになった場合、
randomize #const N 100 #const P 10000 *main dim num,P dim select,N repeat P num(cnt)=rnd(N) select(num(cnt))++//その数字を書いた人数を記録しておく loop M=rnd(N) dialog"当選番号は"+M+"です。" if select(M)=0:dialog"当選者はいませんでした":end hit=rnd(select(M)) hitcnt=0 repeat P if num(cnt)=M{ if hit=hitcnt{ dialog str(cnt)+"さんが当選しました。" break } else{ hitcnt++ continue } } loop end
10000回のループと比較をしなければいけません。
今これは10000回だから良いものの、これが100万回やもっと多くなった場合、
処理が複雑になった場合に厖大な時間が必要となります。
「誰が何を書いたか」を予め二次元配列で確保しておくという手もありますが、
ジャグ配列が使えないとなると(例えば全員が50と書く可能性も想定できるので)
100*10000の配列が必要となります。
これも参加者が100万人に変わったり、1〜100万までの数字に、となった場合に
厖大なメモリを消費してしまうという問題があります。
randomize #const N 100 #const P 10000 *main dim num,P dim select,N dim data,N,P repeat P num(cnt)=rnd(N) data(num(cnt),select(num(cnt)))=cnt select(num(cnt))++//その数字を書いた人数を記録しておく loop M=rnd(N) dialog"当選番号は"+M+"です。" if select(M)=0:dialog"当選者はいませんでした":end hit=rnd(select(M)) dialog str(data(M,hit))+"さんが当選しました。" end
ジャグ配列が使えるならば、
「合計して参加者分の配列さえあれば良く、ループによる比較も要らない」
ため、メモリも時間もかからないということになります。
ということでジャグ配列(ないしはそれに類するもの)を実装したいのですが、
何か良い方法はないでしょうか。