3.1 KiB
id, title, challengeType, forumTopicId, dashedName
| id | title | challengeType | forumTopicId | dashedName |
|---|---|---|---|---|
| 5e4ce2f5ac708cc68c1df261 | 線形合同法 | 1 | 385266 | linear-congruential-generator |
--description--
A linear congruential generator (LCG) is an algorithm that yields a sequence of pseudo-randomized numbers calculated with a discontinuous piecewise linear equation. All linear congruential generators use this formula:
r_{n + 1} = (a \times r_n + c) \bmod m
ここでは、
- $ r_0 $ is a seed.
- $r_1$, $r_2$, $r_3$, ... は乱数です。
- $a$, $c$, $m$ は定数です。
$a$、$c$、および m の値を慎重に選択すると、発生器は 0 から m -1 までの整数の一様分布を発生させます。
LCG の数値は質がよくありません。 r_n と r\_{n + 1} には真の乱数にあるような独立性がありません。 r_n を知っている人は誰でも r\_{n + 1} を予測できます。そのため、LCG は暗号的に安全ではありません。 それでも、ミラー–ラビン素数判定法やフリーセルのカード配りのような単純なタスクには、LCG は十分有効です。 また LCG には、同じ r_0 から簡単に数列を再現できるという利点もあります。 式がとても簡単なので、このような数列を異なるプログラミング言語で再現することも可能です。
--instructions--
r_0,a,c,m,n をパラメータとして取り、 r_n を返す関数を記述してください。
--hints--
linearCongGenerator は関数とします。
assert(typeof linearCongGenerator == 'function');
linearCongGenerator(324, 1145, 177, 2148, 3) は数値を返す必要があります。
assert(typeof linearCongGenerator(324, 1145, 177, 2148, 3) == 'number');
linearCongGenerator(324, 1145, 177, 2148, 3) は 855 を返す必要があります。
assert.equal(linearCongGenerator(324, 1145, 177, 2148, 3), 855);
linearCongGenerator(234, 11245, 145, 83648, 4) は 1110 を返す必要があります。
assert.equal(linearCongGenerator(234, 11245, 145, 83648, 4), 1110);
linearCongGenerator(85, 11, 1234, 214748, 5) は 62217 を返す必要があります。
assert.equal(linearCongGenerator(85, 11, 1234, 214748, 5), 62217);
linearCongGenerator(0, 1103515245, 12345, 2147483648, 1) は 12345 を返す必要があります。
assert.equal(linearCongGenerator(0, 1103515245, 12345, 2147483648, 1), 12345);
linearCongGenerator(0, 1103515245, 12345, 2147483648, 2) は 1406932606 を返す必要があります。
assert.equal(
linearCongGenerator(0, 1103515245, 12345, 2147483648, 2),
1406932606
);
--seed--
--seed-contents--
function linearCongGenerator(r0, a, c, m, n) {
}
--solutions--
function linearCongGenerator(r0, a, c, m, n) {
for (let i = 0; i < n; i++) {
r0 = (a * r0 + c) % m;
}
return r0;
}