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

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

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

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

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

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

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

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

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

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

こんなところです。できるだけ原型を残すスタンスでお願いします。回答お願いします。(土下座100回のつもり)
CC BY-SA 4.0
2018-07-05T15:10:31.267
45340
2018-07-06T03:07:59.750
2018-07-06T03:07:59.750
15171
29193
question
javascript
要素31個の配列からランダムで重複なしに出力する方法
母のために役立つプログラムを書いているとは感心ですね。

それだったら難しいことをせずに`Excel`か`Google Sheets`を使いましょう。  
`RAND`関数を使ってランダムに並べ替えたらそれで終わりです。詳しいやりかたはググればすぐにあります。

また、`Google Sheets`であれば、`JavaScript`ベースの`App
Script`が使えます。それでプログラムすれば数行で書けてしまいます。

```

    function myFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets()[0];
      for ( var i = 1;  i < 32;  i++  ) {
        sheet.getRange(i, 1).setValue(i);
        sheet.getRange(i, 2).setValue(Math.random());
      }
      sheet.sort(2, true);
    };
    
```

配列をランダムに重複なしに出力するのであれば、JavaScriptでも同じような感じで数行で書くことができます。原型を残したいのならば、自分の書いたプログラムを追記しましょう。
CC BY-SA 4.0
2018-07-05T23:32:00.290
45342
2018-07-06T01:14:50.210
2018-07-06T01:14:50.210
15171
15171
45340
answer