Skip to content

Commit 9936f9c

Browse files
committed
generator draft
1 parent a16814a commit 9936f9c

File tree

33 files changed

+503
-0
lines changed

33 files changed

+503
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
# Async iteration
3+
4+
TODO
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function* pseudoRandom(seed) {
2+
let value = seed;
3+
4+
while(true) {
5+
value = value * 16807 % 2147483647
6+
yield value;
7+
}
8+
9+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
describe("pseudoRandom", function() {
2+
3+
it("follows the formula", function() {
4+
let generator = pseudoRandom(1);
5+
6+
assert.equal(generator.next().value, 16807);
7+
assert.equal(generator.next().value, 282475249);
8+
assert.equal(generator.next().value, 1622650073);
9+
});
10+
11+
12+
it("returns same value for the same seed", function() {
13+
let generator1 = pseudoRandom(123);
14+
let generator2 = pseudoRandom(123);
15+
16+
assert.deepEqual(generator1.next(), generator2.next());
17+
assert.deepEqual(generator1.next(), generator2.next());
18+
assert.deepEqual(generator1.next(), generator2.next());
19+
});
20+
21+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
Please note, the same can be done with a regular function, like this:
3+
4+
```js run
5+
function pseudoRandom(seed) {
6+
let value = seed;
7+
8+
return function() {
9+
value = value * 16807 % 2147483647;
10+
return value;
11+
}
12+
}
13+
14+
let generator = pseudoRandom(1);
15+
16+
alert(generator()); // 16807
17+
alert(generator()); // 282475249
18+
alert(generator()); // 1622650073
19+
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
# Pseudo-random generator
3+
4+
There are many areas where we need random data.
5+
6+
One of them is testing. We may need random data: text, numbers etc, to test things out well.
7+
8+
In Javascript, we could use `Math.random()`. But if something goes wrong, we'd like to be able to repeat the test, using exactly the same data.
9+
10+
For that, so called "seeded pseudo-random generators" are used. They take a "seed", the first value, and then generate next ones using a formula. So that the same seed yields the same sequence, and hence the whole flow is easily reproducable. We only need to remember the seed to repeat it.
11+
12+
An example of such formula, that generates somewhat uniformly distributed values:
13+
14+
```
15+
next = previous * 16807 % 2147483647
16+
```
17+
18+
If we use `1` as the seed, the values will be:
19+
1. `16807`
20+
2. `282475249`
21+
3. `1622650073`
22+
4. ...and so on...
23+
24+
The task is to create a generator function `pseudoRandom(seed)` that takes `seed` and creates the generator with this formula.
25+
26+
Use example:
27+
28+
```js
29+
let gen = pseudoRandom(1);
30+
31+
alert(gen.next().value); // 16807
32+
alert(gen.next().value); // 282475249
33+
alert(gen.next().value); // 1622650073
34+
```
29.7 KB
Loading

0 commit comments

Comments
 (0)