September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
52
Task/Subtractive-generator/Dc/subtractive-generator.dc
Normal file
52
Task/Subtractive-generator/Dc/subtractive-generator.dc
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
[*
|
||||
* (seed) lsx --
|
||||
* Seeds the subtractive generator.
|
||||
* Uses register R to hold the state.
|
||||
*]sz
|
||||
[
|
||||
[* Fill ring buffer R[0] to R[54]. *]sz
|
||||
d 54:R SA [A = R[54] = seed]sz
|
||||
1 d 33:R SB [B = R[33] = 1]sz
|
||||
12 SC [C = index 12, into array R.]sz
|
||||
[55 -]SI
|
||||
[ [Loop until C is 54:]sz
|
||||
lA lB - d lC:R [R[C] = A - B]sz
|
||||
lB sA sB [Parallel let A = B and B = A - B]sz
|
||||
lC 34 + d 55 !>I d sC [C += 34 (mod 55)]sz
|
||||
54 !=L
|
||||
]d SL x
|
||||
[* Point R[55] and R[56] into ring buffer. *]sz
|
||||
0 55:R [R[55] = index 0, of 55th last number.]sz
|
||||
31 56:R [R[56] = index 31, of 24th last number.]sz
|
||||
[* Stir ring buffer. *]sz
|
||||
165 [ [Loop 165 times:]sz
|
||||
55;R;R 56;R;R - 55;R:R [Discard a random number.]sz
|
||||
55;R 1 + d 55 !>I 55:R [R[55] += 1 (mod 55)]sz
|
||||
56;R 1 + d 55 !>I 56:R [R[56] += 1 (mod 55)]sz
|
||||
1 - d 0 <L
|
||||
]d sL x
|
||||
LAsz LBsz LCsz LIsz LLsz
|
||||
]ss
|
||||
|
||||
[*
|
||||
* lrx -- (random number from 0 to 10^9 - 1)
|
||||
* Returns the next number from the subtractive generator.
|
||||
* Uses register R, seeded by lsx.
|
||||
*]sz
|
||||
[
|
||||
55;R;R 56;R;R - [R[R[55]] - R[R[56]] is next random number.]sz
|
||||
d 55;R:R [Put it in R[R[55]]. Also leave it on stack.]sz
|
||||
[55 -]SI
|
||||
55;R 1 + d 55 !>I 55:R [R[55] += 1 (mod 55)]sz
|
||||
56;R 1 + d 55 !>I 56:R [R[56] += 1 (mod 55)]sz
|
||||
[1000000000 +]sI
|
||||
1000000000 % d 0 >I [Random number = it (mod 10^9)]sz
|
||||
LIsz
|
||||
]sr
|
||||
|
||||
|
||||
[* Seed with 292929 and print first three random numbers. *]sz
|
||||
292929 lsx
|
||||
lrx psz
|
||||
lrx psz
|
||||
lrx psz
|
||||
12
Task/Subtractive-generator/Zkl/subtractive-generator-1.zkl
Normal file
12
Task/Subtractive-generator/Zkl/subtractive-generator-1.zkl
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
fcn rand_sub(x){
|
||||
var ring=L(),m=(1e9).toInt();
|
||||
mod:='wrap(n){ if(n<0) n+m else n };
|
||||
if(not ring){
|
||||
seed:=L( (if(vm.numArgs) x else m-1), 1);
|
||||
foreach n in ([2 .. 54]){ seed.append((seed[n-2]-seed[n-1]):mod(_)) }
|
||||
foreach n in (55){ ring.append(seed[(34*(n+1))%55]) }
|
||||
do(220-ring.len()){ self.fcn() } // 165
|
||||
}
|
||||
ring.append((ring.pop(0)-ring[-24]):mod(_));
|
||||
return(ring[-1]);
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
do(4){ println(rand_sub(292929)) } //seed ignored after first call
|
||||
Loading…
Add table
Add a link
Reference in a new issue