teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

誤字訂正

2015/11/09 12:11

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  追記:jQueryタグがついてなかったので、jQueryなしで。
24
24
 
25
25
  ```javascript
26
- //シャッルメソッドを定義
26
+ //シャッルメソッドを定義
27
27
  Array.prototype.shuffle = function() {
28
28
  var i = this.length;
29
29
  while (i) {

3

解説の追記

2015/11/09 12:11

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -23,6 +23,7 @@
23
23
  追記:jQueryタグがついてなかったので、jQueryなしで。
24
24
 
25
25
  ```javascript
26
+ //シャッメルメソッドを定義
26
27
  Array.prototype.shuffle = function() {
27
28
  var i = this.length;
28
29
  while (i) {
@@ -42,6 +43,7 @@
42
43
  //配列をシャッフル
43
44
  qNum.shuffle();
44
45
  ```
46
+ 上記のシャッフルメソッドは[Fisher–Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)という割と有名なアルゴリズムで偏りなく高速にシャッフルできます。
45
47
 
46
48
  ちなみに、質問のコードの間違いは、aの初期化の位置ですね。重複チェックのループの前で初期化しないと。
47
49
  ```ここに言語を入力

2

jQueryなしのコードを追記

2015/11/09 04:35

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -18,4 +18,43 @@
18
18
  }
19
19
 
20
20
  qNum = $.shuffle(qNum);
21
+ ```
22
+
23
+ 追記:jQueryタグがついてなかったので、jQueryなしで。
24
+
25
+ ```javascript
26
+ Array.prototype.shuffle = function() {
27
+ var i = this.length;
28
+ while (i) {
29
+ var j = Math.floor(Math.random()*i);
30
+ var t = this[--i];
31
+ this[i] = this[j];
32
+ this[j] = t;
33
+ }
34
+ }
35
+
36
+ var qNum = [];
37
+ Q_MAX = 10;
38
+ //0 ~ 9 までの連番の配列を生成
39
+ for (i = 0; i < Q_MAX; i++) {
40
+ qNum[i] = i;
41
+ }
42
+ //配列をシャッフル
43
+ qNum.shuffle();
44
+ ```
45
+
46
+ ちなみに、質問のコードの間違いは、aの初期化の位置ですね。重複チェックのループの前で初期化しないと。
47
+ ```ここに言語を入力
48
+ while(i < Q_MAX){
49
+ qNum[i] = Math.floor(Math.random() * Q_MAX);
50
+ a = 0; //ここで初期化
51
+ while(a < qNum.length - 1 && i > 0){
52
+ if(qNum[i] === qNum[a]){
53
+ i--;
54
+ break;
55
+ }
56
+ a++;
57
+ }
58
+ i++;
59
+ }
21
60
  ```

1

0 ~ Q_MAX を 0 ~ Q_MAX-1 に修正

2015/11/09 02:07

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -1,7 +1,7 @@
1
- コードから類推するに 要素数 Q_MAX の配列に、0 ~ Q_MAX までの数を重複しないように入れる、
1
+ コードから類推するに 要素数 Q_MAX の配列に、0 ~ Q_MAX-1 までの数を重複しないように入れる、
2
2
  ということですよね。
3
3
 
4
- ならば、0 ~ Q_MAX までの整数をランダムに並べ替える(シャッフルする)というロジックの方がいいと思います。
4
+ ならば、0 ~ Q_MAX-1 までの整数をランダムに並べ替える(シャッフルする)というロジックの方がいいと思います。
5
5
  現状のロジックだと後に行くほど重複する確率が高くなり、再試行が多発します。
6
6
 
7
7
  シャッフルのjQueryプラグインが下記にありますので、それを利用すると簡単です。