回答編集履歴

4

誤字訂正

2015/11/09 12:11

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  ```javascript
50
50
 
51
- //シャッルメソッドを定義
51
+ //シャッルメソッドを定義
52
52
 
53
53
  Array.prototype.shuffle = function() {
54
54
 

3

解説の追記

2015/11/09 12:11

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -48,6 +48,8 @@
48
48
 
49
49
  ```javascript
50
50
 
51
+ //シャッメルメソッドを定義
52
+
51
53
  Array.prototype.shuffle = function() {
52
54
 
53
55
  var i = this.length;
@@ -86,6 +88,8 @@
86
88
 
87
89
  ```
88
90
 
91
+ 上記のシャッフルメソッドは[Fisher–Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)という割と有名なアルゴリズムで偏りなく高速にシャッフルできます。
92
+
89
93
 
90
94
 
91
95
  ちなみに、質問のコードの間違いは、aの初期化の位置ですね。重複チェックのループの前で初期化しないと。

2

jQueryなしのコードを追記

2015/11/09 04:35

投稿

hatena19
hatena19

スコア33759

test CHANGED
@@ -39,3 +39,81 @@
39
39
  qNum = $.shuffle(qNum);
40
40
 
41
41
  ```
42
+
43
+
44
+
45
+ 追記:jQueryタグがついてなかったので、jQueryなしで。
46
+
47
+
48
+
49
+ ```javascript
50
+
51
+ Array.prototype.shuffle = function() {
52
+
53
+ var i = this.length;
54
+
55
+ while (i) {
56
+
57
+ var j = Math.floor(Math.random()*i);
58
+
59
+ var t = this[--i];
60
+
61
+ this[i] = this[j];
62
+
63
+ this[j] = t;
64
+
65
+ }
66
+
67
+ }
68
+
69
+
70
+
71
+ var qNum = [];
72
+
73
+ Q_MAX = 10;
74
+
75
+ //0 ~ 9 までの連番の配列を生成
76
+
77
+ for (i = 0; i < Q_MAX; i++) {
78
+
79
+ qNum[i] = i;
80
+
81
+ }
82
+
83
+ //配列をシャッフル
84
+
85
+ qNum.shuffle();
86
+
87
+ ```
88
+
89
+
90
+
91
+ ちなみに、質問のコードの間違いは、aの初期化の位置ですね。重複チェックのループの前で初期化しないと。
92
+
93
+ ```ここに言語を入力
94
+
95
+ while(i < Q_MAX){
96
+
97
+ qNum[i] = Math.floor(Math.random() * Q_MAX);
98
+
99
+ a = 0; //ここで初期化
100
+
101
+ while(a < qNum.length - 1 && i > 0){
102
+
103
+ if(qNum[i] === qNum[a]){
104
+
105
+ i--;
106
+
107
+ break;
108
+
109
+ }
110
+
111
+ a++;
112
+
113
+ }
114
+
115
+ i++;
116
+
117
+ }
118
+
119
+ ```

1

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

2015/11/09 02:07

投稿

hatena19
hatena19

スコア33759

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