libavutil/lfg.h
2754fe8b
 /*
  * Lagged Fibonacci PRNG
  * Copyright (c) 2008 Michael Niedermayer
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
98790382
 #ifndef AVUTIL_LFG_H
 #define AVUTIL_LFG_H
2754fe8b
 
e4cbf752
 typedef struct AVLFG {
2754fe8b
     unsigned int state[64];
     int index;
 } AVLFG;
 
 void av_lfg_init(AVLFG *c, unsigned int seed);
 
2cf3c863
 /**
49bd8e4b
  * Get the next random unsigned 32-bit number using an ALFG.
2cf3c863
  *
  * Please also consider a simple LCG like state= state*1664525+1013904223,
  * it may be good enough and faster for your specific use case.
  */
2754fe8b
 static inline unsigned int av_lfg_get(AVLFG *c){
     c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
     return c->state[c->index++ & 63];
 }
 
310d4424
 /**
49bd8e4b
  * Get the next random unsigned 32-bit number using a MLFG.
310d4424
  *
89c9ff50
  * Please also consider av_lfg_get() above, it is faster.
310d4424
  */
 static inline unsigned int av_mlfg_get(AVLFG *c){
     unsigned int a= c->state[(c->index-55) & 63];
     unsigned int b= c->state[(c->index-24) & 63];
f39e8b03
     return c->state[c->index++ & 63] = 2*a*b+a+b;
310d4424
 }
 
3ba69a15
 /**
49bd8e4b
  * Get the next two numbers generated by a Box-Muller Gaussian
3ba69a15
  * generator using the random numbers issued by lfg.
  *
ff993cd7
  * @param out array where the two generated numbers are placed
3ba69a15
  */
 void av_bmg_get(AVLFG *lfg, double out[2]);
 
98790382
 #endif /* AVUTIL_LFG_H */