Subtractive generator: Difference between revisions
Content deleted Content added
Restoring visibility of the task description formulae (lost in under-tested cosmetic edits at 04:25, 12 September 2016) |
Added Kotlin |
||
Line 1,019: | Line 1,019: | ||
506003769 |
506003769 |
||
380969305</pre> |
380969305</pre> |
||
=={{header|Kotlin}}== |
|||
{{trans|C}} |
|||
<lang scala>// version 1.1.51 |
|||
const val MOD = 1_000_000_000 |
|||
val state = IntArray(55) |
|||
var si = 0 |
|||
var sj = 0 |
|||
fun subrandSeed(p: Int) { |
|||
var p1 = p |
|||
var p2 = 1 |
|||
state[0] = p1 % MOD |
|||
var j = 21 |
|||
for (i in 1..54) { |
|||
if (j >=55) j -= 55 |
|||
state[j] = p2 |
|||
p2 = p1 - p2 |
|||
if (p2 < 0) p2 += MOD |
|||
p1 = state[j] |
|||
j += 21 |
|||
} |
|||
si = 0 |
|||
sj = 24 |
|||
repeat(165) { subrand() } |
|||
} |
|||
fun subrand(): Int { |
|||
if (si == sj) subrandSeed(0) |
|||
if (si-- == 0) si = 54 |
|||
if (sj-- == 0) sj = 54 |
|||
var x = state[si] - state[sj] |
|||
if (x < 0) x += MOD |
|||
state[si] = x |
|||
return x |
|||
} |
|||
fun main(args: Array<String>) { |
|||
subrandSeed(292_929) |
|||
for (i in 0..9) println("r[${i + 220}] = ${subrand()}") |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
r[220] = 467478574 |
|||
r[221] = 512932792 |
|||
r[222] = 539453717 |
|||
r[223] = 20349702 |
|||
r[224] = 615542081 |
|||
r[225] = 378707948 |
|||
r[226] = 933204586 |
|||
r[227] = 824858649 |
|||
r[228] = 506003769 |
|||
r[229] = 380969305 |
|||
</pre> |
|||
=={{header|Mathematica}}== |
=={{header|Mathematica}}== |