Skip to content

Generators #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 29, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073
```

Please note, the same can be done with a regular function, like this:
لاحظ أن هذا يمكن عمله بدالة عادية كهذا:

```js run
function pseudoRandom(seed) {
Expand All @@ -35,4 +35,4 @@ alert(generator()); // 282475249
alert(generator()); // 1622650073
```

That also works. But then we lose ability to iterate with `for..of` and to use generator composition, that may be useful elsewhere.
وهذا يعمل أيضًا ولكن فقدنا الإمكانية أن نكرر باستخدام التكرار `for..of` واستخدام تكوين الـgenerator وهذا يمكن أن يكون مفيدًا فى مكان ما.
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@

# Pseudo-random generator
# الـgenerator الشبه عشوائي

There are many areas where we need random data.
هناك مواطن كثيرة حيث نحتاج إلى بيانات عشوائية.

One of them is testing. We may need random data: text, numbers, etc. to test things out well.
واحدة منها هي الإختبار (testing). يمكن أن نحتاج إلى بيانات عشوائية: نصوص أو أرقام وهكذا لاختبار الأشياء جيدّا.

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.
في الجافاسكريبت يمكننا استخدام `Math.random()` ولكن إذا حدث أى خطأ فإننا يمكن أن نود أن نعيد الإختبار باستخدام نفس البيانات.

For that, so called "seeded pseudo-random generators" are used. They take a "seed", the first value, and then generate the next ones using a formula so that the same seed yields the same sequence, and hence the whole flow is easily reproducible. We only need to remember the seed to repeat it.
من أجل ذلك نستخدم ما يسمي "seeded pseudo-random generators" فهي تأخذ بذرة "seed" كمتغير أول وتقوم بإنشاء القيم التالية باستخدام معادلة ولذلك فإن البذرة نفسها تظل فى نفس التتابع ويمكن تكرار نفس الخطوات بسهولة. نحتاج فقط أن نتذكر الذرة لتكرارها.

An example of such formula, that generates somewhat uniformly distributed values:
مثال على هذه المعادلة والتى تقوم بإنشاء قيم:

```
next = previous * 16807 % 2147483647
```

If we use `1` as the seed, the values will be:
إذا استخدمنا `1` كبذرة فإن القيم ستكون:
1. `16807`
2. `282475249`
3. `1622650073`
4. ...and so on...
4. ...وهكذا...

The task is to create a generator function `pseudoRandom(seed)` that takes `seed` and creates the generator with this formula.
المهمة تقتضي أن تنشئ دالة generator `pseudoRandom(seed)` والتى تأخذ `seed` وتنشئ الـgenerator بهذه المعادلة.

Usage example:
مثال على استخدامها:

```js
let generator = pseudoRandom(1);
Expand Down
Loading