annotate lfg.h @ 992:a13125b5be3a libavutil

bswap: change ME to NE in macro names Other parts of FFmpeg use NE (native endian) rather than ME (machine). This makes it consistent.
author mru
date Sat, 10 Jul 2010 22:09:01 +0000
parents d7cafb07ae9f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
1 /*
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
2 * Lagged Fibonacci PRNG
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
3 * Copyright (c) 2008 Michael Niedermayer
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
4 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
6 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
11 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
16 *
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
20 */
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
21
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
22 #ifndef AVUTIL_LFG_H
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
23 #define AVUTIL_LFG_H
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
24
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
25 typedef struct {
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
26 unsigned int state[64];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
27 int index;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
28 } AVLFG;
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
29
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
30 void av_lfg_init(AVLFG *c, unsigned int seed);
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
31
535
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
32 /**
957
e34e8d654ded Fix grammar errors in documentation
mru
parents: 798
diff changeset
33 * Get the next random unsigned 32-bit number using an ALFG.
535
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
34 *
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
35 * Please also consider a simple LCG like state= state*1664525+1013904223,
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
36 * it may be good enough and faster for your specific use case.
4ea718352036 Document av_lfg_get().
michael
parents: 533
diff changeset
37 */
533
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
38 static inline unsigned int av_lfg_get(AVLFG *c){
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
39 c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
40 return c->state[c->index++ & 63];
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
41 }
02617c39b8ff Simple lagged fibonacci PRNG.
michael
parents:
diff changeset
42
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
43 /**
957
e34e8d654ded Fix grammar errors in documentation
mru
parents: 798
diff changeset
44 * Get the next random unsigned 32-bit number using a MLFG.
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
45 *
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 567
diff changeset
46 * Please also consider av_lfg_get() above, it is faster.
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
47 */
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
48 static inline unsigned int av_mlfg_get(AVLFG *c){
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
49 unsigned int a= c->state[(c->index-55) & 63];
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
50 unsigned int b= c->state[(c->index-24) & 63];
538
cdbdd48471aa 1000l typo my new PRNG converged to -1.
michael
parents: 537
diff changeset
51 return c->state[c->index++ & 63] = 2*a*b+a+b;
537
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
52 }
2862fa9da110 Add a multiplicative LFG for those thinking the additive is not good
michael
parents: 535
diff changeset
53
798
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
54 /**
957
e34e8d654ded Fix grammar errors in documentation
mru
parents: 798
diff changeset
55 * Get the next two numbers generated by a Box-Muller Gaussian
798
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
56 * generator using the random numbers issued by lfg.
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
57 *
984
d7cafb07ae9f Restore array sizes in doxygen parameter names.
diego
parents: 970
diff changeset
58 * @param out[2] array where the two generated numbers are placed
798
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
59 */
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
60 void av_bmg_get(AVLFG *lfg, double out[2]);
41da9d9d39b7 Implement av_bmg_next(), a Box-Muller Gaussian random generator.
stefano
parents: 633
diff changeset
61
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 538
diff changeset
62 #endif /* AVUTIL_LFG_H */