Hallo,
weiss vielleicht jemand, wie ich den oder die Startwerte für diesen
Algorithmus ändern kann bzw welche das sind? Ich möchte die Funktion in
2 aufteilen, so dass sich immer andere Zufalls Folgen ergeben, je
nachdem welcher Wert aus dem A/D Wandler ausgelesen wird. Da ich nur 16
Bit Zahlen brauche nehme ich den Wert unten % 0xFFFF, hoffe das ist kein
Problem für die Verteilung der Zahlen. Die Periodendauer ist 10^240,
also schon ganz nett.
Gruss,
Christian
1 | // Mersenne - Twister Algorithmus
|
2 | uint32_t TT800(uint16_t range) {
|
3 | #define N 25
|
4 | #define M 7
|
5 | static const uint32_t A[2] = { 0, 0x8ebfd028 };
|
6 | static uint32_t y[N];
|
7 | static int index = N+1;
|
8 | uint32_t e;
|
9 |
|
10 | if (index >= N) {
|
11 | int k;
|
12 | if (index > N) {
|
13 | unsigned r = 9, s = 3402;
|
14 | for (k=0; k<N; ++k) {
|
15 | r = 509845221 * r + 3;
|
16 | s *= s + 1;
|
17 | y[k] = s + (r >> 10);
|
18 | }
|
19 | }
|
20 | for (k=0; k<N-M; ++k)
|
21 | y[k] = y[k+M] ^ (y[k] >> 1) ^ A[y[k] & 1];
|
22 | for (; k<N; ++k)
|
23 | y[k] = y[k+(M-N)] ^ (y[k] >> 1) ^ A[y[k] & 1];
|
24 | index = 0;
|
25 | }
|
26 |
|
27 | e = y[index++];
|
28 | /* Tempering */
|
29 | e ^= (e << 7) & 0x2b5b2500;
|
30 | e ^= (e << 15) & 0xdb8b0000;
|
31 | e ^= (e >> 16);
|
32 | return (e % range);
|
33 | #undef N
|
34 | #undef M
|