教師である母のために役立つプログラムを書いているのですが、どれだけ試行錯誤しても分かりません。

学校のクラスの人数31人をランダムで一人指名するプログラムです。一人一回指名され、31回目で全員が発言するようにしたいのですが、今のままだと同じ人を何回か指名することがあり、重複しないようにしたいのですが、どうしても表現できません。かなり情弱でして、関数や変数の名前もぐちゃぐちゃですが、重複せずランダムで数字(出席番号)を出力するプログラムを作りたいです。

自分の書いたプログラムはどれも複雑なものは無いですが一応説明させていただくと、

関数choice : 変数r,配列liRandom,変数rがとる値によって変わるif文31個がある

変数r : 配列liRandomのlengthの範囲でランダムに取りうる数字+1が代入される。

配列liRandom : iZero~iThirtyが入っている。 配列liRandomは0~30、合計31,変数rは1~31、合計31です。rが1の時liRandomは0の関係にあり、rが31の時liRandomはundefinedなのですが、エラーを抑制するにはこれがベストだと思います。

id zOne~zThirtyOne : 生徒の席を表に表していて、一席ずつzOne,zTwoとidを振っている。変数rが選んだ席をチェックするため

id a1~a31 : 変数rが選んだ結果を履歴として残しておくために用意した。document.getElementで変数rに書き換える

配列littleOut : これに変数rが選んだ値を先頭に追加していくと、、配列の2番目、3番目は前に引き当てた数字になる。最初から2番目3番目は無いのでundefinedになるが、if文でundefinedを空白に書き換えている

id subText,threeText : 一回前と二回前まで自分が押した数字を確認できるように配列littleOutの2番目、3番目をこのidに出力する

こんなところです。できるだけ原型を残すスタンスでお願いします。回答お願いします。(土下座100回のつもり)