mirror of
https://github.com/danog/Telegram.git
synced 2024-12-03 09:57:46 +01:00
82 lines
2.9 KiB
C
82 lines
2.9 KiB
C
/* -------------------------------------------------------------------------
|
|
* This is an ANSI C library for multi-stream random number generation.
|
|
* The use of this library is recommended as a replacement for the ANSI C
|
|
* rand() and srand() functions, particularly in simulation applications
|
|
* where the statistical 'goodness' of the random number generator is
|
|
* important. The library supplies 256 streams of random numbers; use
|
|
* SelectStream(s) to switch between streams indexed s = 0,1,...,255.
|
|
*
|
|
* The streams must be initialized. The recommended way to do this is by
|
|
* using the function PlantSeeds(x) with the value of x used to initialize
|
|
* the default stream and all other streams initialized automatically with
|
|
* values dependent on the value of x. The following convention is used
|
|
* to initialize the default stream:
|
|
* if x > 0 then x is the state
|
|
* if x < 0 then the state is obtained from the system clock
|
|
* if x = 0 then the state is to be supplied interactively.
|
|
*
|
|
* The generator used in this library is a so-called 'Lehmer random number
|
|
* generator' which returns a pseudo-random number uniformly distributed
|
|
* 0.0 and 1.0. The period is (m - 1) where m = 2,147,483,647 and the
|
|
* smallest and largest possible values are (1 / m) and 1 - (1 / m)
|
|
* respectively. For more details see:
|
|
*
|
|
* "Random Number Generators: Good Ones Are Hard To Find"
|
|
* Steve Park and Keith Miller
|
|
* Communications of the ACM, October 1988
|
|
*
|
|
* Name : rngs.c (Random Number Generation - Multiple Streams)
|
|
* Authors : Steve Park & Dave Geyer
|
|
* Language : ANSI C
|
|
* Latest Revision : 09-22-98
|
|
* -------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
#include "rngs.h"
|
|
|
|
#define MODULUS 2147483647 /* DON'T CHANGE THIS VALUE */
|
|
#define MULTIPLIER 48271 /* DON'T CHANGE THIS VALUE */
|
|
#define CHECK 399268537 /* DON'T CHANGE THIS VALUE */
|
|
#define STREAMS 256 /* # of streams, DON'T CHANGE THIS VALUE */
|
|
#define A256 22925 /* jump multiplier, DON'T CHANGE THIS VALUE */
|
|
#define DEFAULT 123456789 /* initial seed, use 0 < DEFAULT < MODULUS */
|
|
|
|
static long seed[STREAMS] = {DEFAULT}; /* current state of each stream */
|
|
static int stream = 0; /* stream index, 0 is the default */
|
|
static int initialized = 0; /* test for stream initialization */
|
|
|
|
|
|
|
|
float frand(float from, float to)
|
|
{
|
|
/*
|
|
int r = random();
|
|
int q = r%(to-from);
|
|
|
|
|
|
return (float)r-q*(to-from)+from;
|
|
*/
|
|
|
|
return (float)(((double)random()/RAND_MAX)*(to-from)+from);
|
|
}
|
|
|
|
int irand(int from, int to)
|
|
{
|
|
//srand(time(NULL));
|
|
|
|
return (int)(((double)random()/RAND_MAX)*(to-from+1)+from);
|
|
}
|
|
|
|
int signrand()
|
|
{
|
|
return irand(0, 1)*2-1;
|
|
}
|
|
|
|
|
|
|
|
|
|
|