CheckBadValues should run on the first sample as well
[supercollider.git] / HelpSource / Reference / randomSeed.schelp
blob6d8ffc70bf877d456b36fe6e70a39afb654dfd9a
1 title::Random Seed
2 summary:: Random generator seed
3 categories::Core>Kernel, Random
4 related:: Guides/Randomness, Classes/RandSeed, Classes/Pseed, Classes/Thread
6 section:: Introduction
8 Every link::Classes/Thread:: in sclang has a (pseudo-) random number generator that is responsible for all randomization within this thread. Each random number generator has its own seed (starting point) from which the series of values is generated. This seed can be set and after that, the randgen (being strictly deterministic) produces exactly the same numbers again. 
10 In order to save diskspace, you can reproduce any sequence of randomized data just by one Integer number that you can write down in your notebook.
12 method:: randSeed
14 code::
15 // every thread, also a Routine, has a random generator seed:
17 r = Routine({
18         loop({#[1,2,3,4,5].choose.yield })
19 });
20 r.randSeed = 1923;
23 // using the routine to fill an array
24 Array.fill(7, r);
26 // setting the random generator seed back to our initial seed
27 r.randSeed = 1923;
29 // causes this array to be identical
30 Array.fill(7, r);
33 subsection::Inheriting Seeds
35 Also it is possible to set the seed of the running thread that 
36 all threads started within will inherit.
38 code::
39 thisThread.randSeed = 1923;
41 // create a function that returns a routine
43 r = { Routine({
44         loop({#[1,2,3,4,5].choose.yield })
45 }) };
47 Array.fill(7, r.value);
49 // reset the seed
50 thisThread.randSeed = 1923;
52 Array.fill(7, r.value);
55 code::
56 // use the seed to completely reproduce a sound:
58 SynthDef(\help_randomSeed, { arg out=0, freq=440;
59         Out.ar(out,
60                 Line.kr(1, 0, 0.3, doneAction:2) * 
61                 Resonz.ar(
62                         Dust2.ar([10, 10], 270) + WhiteNoise.ar(4),
63                 freq, 0.01) 
64         )
65 }).send(s);
67 SynthDef(\help_setRandomSeed, { arg seed=1956, tbus=0.0;
68                 RandSeed.kr(tbus, seed);
69 }).send(s);
72 // run a patch
74 x = Synth(\help_setRandomSeed);
75 r = Routine({
76         loop({
77                 Synth(\help_randomSeed, [\freq, rrand(440, 700)]);
78                 0.25.wait;
79         })
80 }).play;
84 // make a reset task
87 d = 1250;// seed
88 t = Task({
89         loop({
90                 x.set(\seed, d, \tbus, 1.0); r.randSeed = d;
91                 0.1.wait;
92                 x.set(\tbus, 0.0);
93                 1.9.wait;
94         })
95 });
98 // sound starts to loop
99 t.start;
101 d = 1251; // different loop
102 d = 1925;
105 // sound is just like random again, not interested in anything.
106 t.stop;