Skip to content

Commit fcd87f6

Browse files
committed
Merge branch 'shuffle-subset' of github.com:PrajitR/d3 into shuffle-subset
2 parents 94168fa + 0f03bdd commit fcd87f6

5 files changed

Lines changed: 59 additions & 9 deletions

File tree

d3.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,15 @@
163163
return d3_ascending(f(d), x);
164164
} : f);
165165
};
166-
d3.shuffle = function(array) {
167-
var m = array.length, t, i;
166+
d3.shuffle = function(array, i0, i1) {
167+
if ((m = arguments.length) < 3) {
168+
i1 = array.length;
169+
if (m < 2) i0 = 0;
170+
}
171+
var m = i1 - i0, t, i;
168172
while (m) {
169173
i = Math.random() * m-- | 0;
170-
t = array[m], array[m] = array[i], array[i] = t;
174+
t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
171175
}
172176
return array;
173177
};

d3.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/arrays/shuffle.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
d3.shuffle = function(array) {
2-
var m = array.length, t, i;
1+
d3.shuffle = function(array, i0, i1) {
2+
if ((m = arguments.length) < 3) { i1 = array.length; if (m < 2) i0 = 0; }
3+
var m = i1 - i0, t, i;
34
while (m) {
45
i = Math.random() * m-- | 0;
5-
t = array[m], array[m] = array[i], array[i] = t;
6+
t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
67
}
78
return array;
89
};

test/arrays/shuffle-test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
var vows = require("vows"),
2+
load = require("../load"),
3+
assert = require("../assert"),
4+
seedrandom = require("seedrandom");
5+
6+
var suite = vows.describe("d3.shuffle");
7+
8+
var _random;
9+
10+
suite.addBatch({
11+
"shuffle": {
12+
topic: load("arrays/shuffle").sandbox({Math: Math}).expression("d3.shuffle"),
13+
"(using seedrandom)": {
14+
topic: function(random) {
15+
_random = Math.random;
16+
return random;
17+
},
18+
"shuffles an array in-place": function(shuffle) {
19+
Math.seedrandom("a random seed.");
20+
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
21+
assert.strictEqual(shuffle(array), array);
22+
assert.deepEqual(array, [6, 4, 7, 9, 3, 1, 5, 8, 0, 2]);
23+
},
24+
"shuffles a subset of an array from the specified start": function(shuffle) {
25+
Math.seedrandom("a random seed.");
26+
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
27+
assert.strictEqual(shuffle(array, 4), array);
28+
assert.deepEqual(array, [0, 1, 2, 3, 9, 7, 6, 8, 4, 5]);
29+
},
30+
"shuffles a subset of an array between the specified start and end": function(shuffle) {
31+
Math.seedrandom("a random seed.");
32+
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
33+
assert.strictEqual(shuffle(array, 3, 8), array);
34+
assert.deepEqual(array, [0, 1, 2, 5, 7, 6, 3, 4, 8, 9]);
35+
},
36+
teardown: function() {
37+
Math.random = _random;
38+
}
39+
}
40+
}
41+
});
42+
43+
suite.export(module);

test/math/random-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var vows = require("vows"),
55

66
var suite = vows.describe("d3.random");
77

8+
var _random;
9+
810
// Testing a random number generator is a bit more complicated than testing
911
// deterministic code, so we use different techniques.
1012
//

0 commit comments

Comments
 (0)